這是導致問題的順序:在數據庫JPA:什麼是與惰性初始化集合合併的行爲?
- 我有一個球隊戰績和3球員紀錄。隊列實體有一個使用FetchType.LAZY的列表,CascadeType.ALL
- 單擊webui上的搜索按鈕
- 調用服務器端使用JPA查詢的查詢,查找所有Team記錄,在這種情況下,查詢返回的團隊實體只有1條記錄(其中包含玩家實體列表的代理)
- 將此實體映射到DTO,並將此DTO返回到webui,跳過玩家實體列表的映射
- Webui呈現HTML格式的DTO,隨時可以接收用戶的修改
- 用戶修改團隊的屬性,比如它的時間爲f ounded
- 上的WebUI保存按鈕被點擊
- 轉換的DTO球隊實體,將被用於更新現有的球隊戰績
- 但在這種情況下,如果我是使用em.merge (teamEntity),球隊記錄將會更新,但球員名單會發生什麼?因爲從DTO轉換到團隊實體時,teamEntity有一個空的玩家實體列表。合併後,我注意到teamEntity的細節大小爲0。但刷新該實體後,em.refresh(teamEntity)將返回3的詳細大小。
林困惑於:
- 爲什麼是0合併後的尺寸?這就像不再代表記錄
- 在做測試之前,我一直在想,因爲我將一個teamEntity與一個空的細節合併在一起,所以細節將被刪除。
請賜教:)
謝謝!
axtavt:謝謝你的解釋!只是測試了你提到的所有可能性,現在開始瞭解情況。關於你的語句:「如果你在調用refresh()之前調用flush(),並且Team是擁有者的一方,那麼list將是空的,因爲在flush()期間關係的銷燬會傳播到數據庫」,那將會是這樣的if使用orphanRemoval true。如果不是這樣,那麼這些孩子就會生存下來,並且刷新會在實體的玩家列表中恢復它們再次感謝 ! – bertie 2011-03-10 02:59:16
你使用哪種JPA提供程序?我熟悉Hibernate,沒有JPA,也有合併操作和懶惰集合,當我嘗試從分離的實例中讀取未初始化的集合時,我得到一個異常,而不是一個空集合。我認爲這是提供者的錯誤。作爲解決方案,請在teamPlayer分離之前初始化該集合。 – Oliv 2012-08-28 10:22:56