2015-11-28 64 views
0

我有以下情形。使用從JPA到子級對象的級聯使用JPA

我們在我們的域中有兩個對象,它們構成父子關係。

人是父母,角色是孩子。這兩個對象來自同一個祖先。

不是將關係建模爲雙向,而是隻包含表示爲long的父對象Id。

父項具有到子項的@oneToMany映射。

我們遇到的問題如下所示:域層當前創建並持久保留子項,然後僅將父項的ID更新到自身上。

然而,這種方法的問題是,已經加載到持久性上下文中的Person不會被這個新角色重新渲染。這種方法正在我們的應用程序中造成混亂,因爲我們試圖在單個事務中進行多項操作。我們也無法利用二級緩存。我們希望創建一個雙向關係,但是我不清楚處理子對象的最佳方法是什麼。

我所看到的所有建議都表明應該保存父對象,然後這應該級聯到孩子。還建議所有級聯類型都應該遵循這種方法。所以對孩子的改變是通過父母來堅持的。

然而,我並不是在質疑這種方法,因爲已經有一個實現,是否可以從子級級聯到父級?我會想象這應該適用於合併和刷新?這似乎是一種可行的方法,用於將持久化上下文與對象的更改同步,而無需更改底層實現,而不必添加@ManyToOne批註。

我歡迎任何意見或建議。

回答

1

不,從兒童級聯到家長根本不是一個好主意。

我建議你採取另一種方法,並從兒童到父母的關聯,起訴@ManyToOne關聯。 @ManyToOne關係是最自然的關聯,因爲它遵循RDBMS採用的FK方法。

由於您已經使用@OneToMany關聯,因此您只需將其轉換爲mappedBy即可,並從父級向子級添加級聯。這種方法可以讓你孤立地保存孩子。唯一需要注意的是如果EntityManager已加載Parent和Child,則同步雙方。但是,如果只在沒有獲取父項的情況下加載子項,則可以簡單地與子項一起操作(例如,將父項設置爲null)。

+0

謝謝!您是否需要刷新L1和L2(如果正在使用中),還是需要刷新L1緩存也刷新L2緩存? –

+0

默認情況下,EclipseLink默認使用L2緩存,但我不確定它是否也適用於集合。如果您不使用收集緩存,則無需刷新父項。 –