2010-02-24 116 views
1

我遇到了Hibernate的問題。 我目前的項目是一個小遊戲。在這個遊戲中你有一個董事會它有很多領域每個與令牌
我可以在沒有任何問題的情況下在空數據庫上進行選擇,但如果我將一個對象放入其中(保存工作無任何異常,並且在數據庫值看起來不錯後)我收到異常。
在董事會類有趣的部分:休眠在選擇時執行刪除

@OneToMany(fetch=FetchType.EAGER) 
@MapKey(name = "point") 
public Map<Point, Field> getGameMatrix() { 
    return gameMatrix; 
} 

我爲獲得董事會查詢:

return getHibernateTemplate().loadAll(Board.class); 

日誌現在這樣出現:

休眠:選擇THIS_。 id as id0_2_, this_.uniqueClassName as uniqueCl3_0_2_,this_.borderDimension as borderDi4_0_2_,this_.dim ension如 dimension0_2_,this_.TYPE如TYPE0_2_, gamematrix2_.Board_id如Board1_4_, field3_.id如gameMatrix2_4_,(從場A11選擇 a11.point其中 a11.id = gamematrix2_.gameMatrix_id)作爲 formula0_4_,field3_。 id作爲id1_0_, field3_.point爲point1_0_, field3_.token_id爲token3_1_0_, token4_.id爲id2_1_,token4_.name爲 name2_1_,token4_.uniqueClassName從董事會 uniqueCl4_2_1_,token4_.TYPE作爲 TYPE2_1_ THIS_左外 加入Board_Field gamematrix2_ this_.id = gamematrix2_.Board_id left outer join Field fi eld3_上 gamematrix2_.gameMatrix_id = field3_.id 左外上 field3_.token_id = token4_.id

加入令牌token4_直到有它看起來不錯,但隨後休眠執行以下操作:

Hibernate: delete from Board_Field where Board_id=? 
Hibernate: insert into Board_Field (Board_id, gameMatrix_id) values (?, ?) 

而且我得到這個異常:

異常在線程 「AWT-EventQueue的 - 0」 org.springframework.dao.InvalidDataAccessApiUsageException: 對象引用未保存的瞬態 實例 - 在沖洗前保存瞬態實例 :Field;嵌套0​​例外是 org.hibernate.TransientObjectException: 對象引用一個未保存的瞬態 實例 - 沖洗之前保存的瞬態的實例 :現場

我不理解爲什麼它使delete語句。
任何想法?
感謝

+0

早期交易是否正確關閉? – Padmarag 2010-02-24 08:49:31

+0

在這個問題上的任何進展? – Bozho 2010-02-25 13:10:02

回答

1

我的同事有類似的問題。他現在不是這樣,但事情與數據庫完整性有關。

看來Hibernate有更多的約束定義了數據庫。當它加載一些數據時,Hibernate發現數據庫中的一些記錄不能存在,並試圖刪除它。

嘗試檢查是否有一些應該被定義但未定義的外鍵被違反並嘗試使數據一致。

0

在我看來,要添加一個字段對象的字段在董事會類的集合,但你必須先堅持新Field對象(你可能new'ing吧)

因此異常消息:對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例:字段

+0

我正在這樣做,當我想要保存紙板時,我沒有得到例外。保存電路板的工作原理和數據庫中的值都很好。當我想要選擇所有電路板時,我會得到例外。 – funny 2010-02-24 09:04:38

1

您需要設置cascade屬性:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
@MapKey(name = "point") 
public Map<Point, Field> getGameMatrix() { 
    return gameMatrix; 
} 

而且你還需要重寫hashCode()equals()PointField - 讓你的IDE(Eclipse中,NetBeans中的IntelliJ)生成它們,使用它們的業務密鑰(即不是他們的自動生成的ID)