2014-11-14 139 views
0

我正在面臨與聲音與對象緩存相關的休眠問題。休眠檢索髒對象

詳細描述問題,我有一個實體,我們稱它爲A,列表屬性映射爲@OneToMany(cascade=CascadeType.ALL, mappedBy="attribute")。列表中的對象是B類的實體,並與A具有雙向關係。因此B具有指向A的屬性,其映射爲@OneToOne(cascade=CascadeType.MERGE)。我從數據庫中獲取對象A,並將新的對象B添加到A的列表中,並調用session.update(A)

問題出現時,我得到所有A對象調用session.createCriteria(A.class).list();,完全訪問我更新的A對象和我添加的B對象不在列表中。

我試圖在更新A後致電session.refresh(A),但問題仍然存在。

Anyboy是否知道如何處理它。

回答

0

你有一個@OneToMany(級聯= CascadeType.ALL,mappedBy =「屬性」)在A類映射到B元素和B你有@OneToOne(cascade = CascadeType.MERGE)元素=>它不相干。

你應該在類B的@ManyToOne

這裏你可以看到一個例子:http://fruzenshtein.com/bidirectional-many-to-one-association/

如果你想添加一個新的B對象,你需要處理因爲ID雙向鏈接。

「我從數據庫中獲得對象A並添加一個新對象B」=> B有鏈接到A?如果不是雙向連接不受尊重。

編輯:你可以在這裏看到一些解釋http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

「由於工作的關係是雙向的,從而將應用程序更新的關係的一個側面,對方也應該得到更新,並且在同步中。 JPA,就像Java中的一般情況一樣,應用程序或對象模型負責維護關係,如果應用程序添加到關係的一側,則它必須添加到另一側。

+0

你說得對。 OneToMany取代了OneToOne,但問題仍然存在。 – 2014-11-14 17:29:34

+0

我已經完成答案 – rlm 2014-11-14 17:30:22

+0

謝謝你的答覆,但問題仍然存在。 – 2014-11-14 18:11:30

0

由於您在實體AB之間存在雙向關係,因此您還需要在Java代碼中維護關係。

基於您的代碼,讓說:

A.java

@OneToMany(cascade=CascadeType.ALL, mappedBy="attribute") 
List<B> bObjs; 

B.java

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn 
A attribute; 

然後維持在Java代碼中,你需要雙方等來設定的關係這個:

a.setBObjs(listOfBs); 
b.setA(a); 

然後你可以調用session.update(a),這樣hibernate就可以正確地保存實體。

+0

JoinColumn註釋的使用權限是多少?如果不是的話,我在你的回覆中顯示了你的行爲。 – 2014-11-14 19:02:30

+0

如果你刪除JoinColumn,那麼hibernate默認創建一個Join表,所以它不是強制性的。你能否顯示你已經嘗試過的確切代碼,並將你的實體發佈到問題上? – Chaitanya 2014-11-15 00:09:03