2013-09-24 33 views
0

我有一個容器管理的事務,並且在一個方法中有一個與該事務關聯的實體管理器。我擁有的表是父表和另一個包含父表子項的表的關聯。同一個EJB事務中的多次刷新導致第一次刷新的更改消失

在同一會話中,我按以下順序執行以下項目: 最初在會話中,我們不會有父對象或子對象。但父對象將存在於數據庫中,並且子項將被添加到我們感興趣的方法。

  1. 我從會話中的數據庫中獲得父對象,所以此父對象將在會話中。
  2. 我創建一個新的子記錄,並將此子代與父表關聯起來,因爲父代是會話的一部分,所以hibernate必須注意在子表中添加子記錄的正確性?
  3. 然後我會在這一點上執行刷新。
  4. 再次我會添加一個新的孩子到父親的集合
  5. 如前所述,hibernate必須照顧添加它的禮儀嗎?
  6. 我現在正在執行刷新操作。
  7. 在EJB事務結束時,hibernate會生成所有其他的sql語句。

執行這些操作後,我發現在數據庫中只有第二次添加的子節點正在與父表關聯。但是對於第一個子節點而言,父節點沒有設置。

如果我刪除添加兩個孩子之間的沖洗,孩子們正在正確地與父母關聯.Flush在這裏造成了一個問題,但我不得不在任何成本下使用刷新,因爲考慮到我正在關聯100孩子曾經拍攝過然後執行同花,後來我會聯想另外10個孩子,然後做一個刷新只有最後10個孩子與父母關聯所有其他人都在孤兒階段。這對我造成了一個問題!:(

請回復如何解決這個問題。我應該執行一些其他操作,如刷新之前更新或saveOrUpdate?

算法在這裏因爲代碼很長很長,我將發佈如何執行操作的算法 假設我有兩個表,一個用於名爲PARENT的父項,另一個用於名爲CHILD的子項\ 而子實體從父實體延伸 假設最初我在DB中只有一個父記錄,並且在子表中沒有CHILD記錄 子女與父母之間存在雙向鏈接,一對多和反之亦然。 在事務開始時,我將獲取數據庫的父數據,以便父級與持久性上下文相關聯。 現在假設我正在創建一個新的兒童POGO對象並填充其數據。假設我將創建20個這樣的對象,然後將雙向的孩子關聯到孩子的父母和父母。 由於父級在hibernate上下文中,當我將它關聯到子級時,hibernate將負責創建和建立鏈接。 現在假設我在會話上下文中進行了刷新。 接下來,我創建了10個孩子的POGO對象,並對父級執行相同的關聯,並再次執行刷新。 在交易結束後,當我檢查數據庫時,我發現前20個條目在數據庫中存在,但是它們與父代的關聯不存在。但是對於最後添加的10個子對象,父項的條目和關聯都在那裏。 當我刪除在添加20和10之間的孩子之間的沖洗,我看到所有的30正確關聯。我想知道爲什麼沖洗事先導致該問題

謝謝

+0

請包括相關的代碼:Annotations,hbm.xml,...它可能是一個雙向的ManyToOne嗎?你有級聯定義嗎? – greyfairer

+0

嗨@greyfairer有一個從父母到孩子的雙向一對多映射,反之亦然。cascasde類型全部是 –

回答

0

你需要的,如果您使用的是雙向關係在休眠參照特別照顧:

<class name="Person"> 
<id name="id" column="personId"> 
    <generator class="native"/> 
</id> 
<many-to-one name="address"   column="addressId"   not-null="true"/> 
</class> 
<class name="Address"> 
<id name="id" column="addressId"> 
    <generator class="native"/> 
</id> 
<set name="people" inverse="true"> 
    <key column="addressId"/> 
    <one-to-many class="Person"/> 
</set> 
</class> 

在這種情況下,如果你添加一個人到address.people,但是person.address是null,hibernate不會保存這個人,因爲address.people關係是inverse =「true」。

您需要設置爲休眠關係的兩個方向正確的儲存:

public void addPerson(Person person) { 
    person.setAddress(this); 
    this.people.add(person); 
} 

1.2.6 Working bi-directional links在休眠教程。

+0

Hi @greyfairer感謝上述評論和信息。因爲我有雙向協作。當我添加到協調的一邊時,我確保對方也推送同樣的更新:(但仍然是問題在那裏,我會發布我的代碼,以便你可以得到更多的想法。 –

+0

請找到算法在這個問題本身,我已經編輯它 –

+0

對不起,你需要粘貼代碼的主要部分,使用{}按鈕來標記代碼,如果它太長,stackoverflow會在它旁邊放置一個滾動條。如果你說:'孩子延伸父母',有很多方法可以做這個錯誤... 你有沒有嘗試每個孩子的Session.save(孩子)?這可能是一個快速(但髒)解決方法。 – greyfairer