我有一個容器管理的事務,並且在一個方法中有一個與該事務關聯的實體管理器。我擁有的表是父表和另一個包含父表子項的表的關聯。同一個EJB事務中的多次刷新導致第一次刷新的更改消失
在同一會話中,我按以下順序執行以下項目: 最初在會話中,我們不會有父對象或子對象。但父對象將存在於數據庫中,並且子項將被添加到我們感興趣的方法。
- 我從會話中的數據庫中獲得父對象,所以此父對象將在會話中。
- 我創建一個新的子記錄,並將此子代與父表關聯起來,因爲父代是會話的一部分,所以hibernate必須注意在子表中添加子記錄的正確性?
- 然後我會在這一點上執行刷新。
- 再次我會添加一個新的孩子到父親的集合
- 如前所述,hibernate必須照顧添加它的禮儀嗎?
- 我現在正在執行刷新操作。
- 在EJB事務結束時,hibernate會生成所有其他的sql語句。
執行這些操作後,我發現在數據庫中只有第二次添加的子節點正在與父表關聯。但是對於第一個子節點而言,父節點沒有設置。
如果我刪除添加兩個孩子之間的沖洗,孩子們正在正確地與父母關聯.Flush在這裏造成了一個問題,但我不得不在任何成本下使用刷新,因爲考慮到我正在關聯100孩子曾經拍攝過然後執行同花,後來我會聯想另外10個孩子,然後做一個刷新只有最後10個孩子與父母關聯所有其他人都在孤兒階段。這對我造成了一個問題!:(
請回復如何解決這個問題。我應該執行一些其他操作,如刷新之前更新或saveOrUpdate?
算法在這裏因爲代碼很長很長,我將發佈如何執行操作的算法 假設我有兩個表,一個用於名爲PARENT的父項,另一個用於名爲CHILD的子項\ 而子實體從父實體延伸 假設最初我在DB中只有一個父記錄,並且在子表中沒有CHILD記錄 子女與父母之間存在雙向鏈接,一對多和反之亦然。 在事務開始時,我將獲取數據庫的父數據,以便父級與持久性上下文相關聯。 現在假設我正在創建一個新的兒童POGO對象並填充其數據。假設我將創建20個這樣的對象,然後將雙向的孩子關聯到孩子的父母和父母。 由於父級在hibernate上下文中,當我將它關聯到子級時,hibernate將負責創建和建立鏈接。 現在假設我在會話上下文中進行了刷新。 接下來,我創建了10個孩子的POGO對象,並對父級執行相同的關聯,並再次執行刷新。 在交易結束後,當我檢查數據庫時,我發現前20個條目在數據庫中存在,但是它們與父代的關聯不存在。但是對於最後添加的10個子對象,父項的條目和關聯都在那裏。 當我刪除在添加20和10之間的孩子之間的沖洗,我看到所有的30正確關聯。我想知道爲什麼沖洗事先導致該問題
謝謝
請包括相關的代碼:Annotations,hbm.xml,...它可能是一個雙向的ManyToOne嗎?你有級聯定義嗎? – greyfairer
嗨@greyfairer有一個從父母到孩子的雙向一對多映射,反之亦然。cascasde類型全部是 –