2012-12-14 111 views
2

我對使用Hibernate時一對多/多對一關係的正確選擇的正確選擇有點困惑。 我可以想象這種關係的兩個例子:用於一對多/多對一關係的休眠設置

  1. Order/OrderLine對是第一個例子。在這對訂單中有'主'角色。人們想要保存訂單,因此保存所有的項目。
  2. 組/用戶是第二個例子。在這對中,用戶具有「主」角色。人們更傾向於通過將用戶分配給某個組來保存用戶。

的兩個實施例中的內部結構是相同的,如果我們抽象遠離細節,如在

public class Order/Group implements Serializable { 
    private Integer id; 
    private Set<OrderLine/User> children = new HashSet<OrderLine/User>(); 
} 

public class OrderLine/User implements Serializable { 
    private Integer id; 
    private Order/Group parent; 
} 

的休眠註釋映射將分別

@OneToMany(mappedBy = "parent") 

@ManyToOne 
@JoinColumn(name = "id", nullable = false) 

邏輯離去訂單行/用戶擁有方。

上述用例是否對擁有方的關係選擇產生影響?一個人反過來擁有或保存/刪除父級與級聯選項就足夠了?添加/刪除一些孩子是否正常,然後用orphanRemoval(訂單 - 訂單行)還是沒有它(組 - 用戶)將父母持續保存到數據庫?最後,哪一方應該對某些行爲負責,例如在清理組中的用戶時保持現狀,或者通過添加和刪除項目來更改訂單?

回答

2

其實,你沒有太多的選擇。在一個雙向的OneToMany關聯中,所有者端總是多方(Hibernate有一些技巧可以使反轉成爲可能,但這太可怕了,並且不受JPA,AFAIK的支持)。

但是,不要將太多的價值歸因於這種所有權。它唯一意味着Hibernate將只考慮OrderLine(或用戶)中的parent字段來確定是否存在關聯。就這樣。您仍然可以自由組織代碼,只要您想要將OrderLine添加到某個訂單中,並記得初始化父字段,並將其設置爲null(如果您想將其從訂單中分離出來)。

+0

所以在這種情況下,如果我想通過擁有方來管理對象,我會在所有想要保存/更新的孩子中設置合適的父字段,並將父字段設置爲null我想刪除的孩子,相應地重新排列父母中的孩子的列表/集合,並將保存父母,我可以確定這將是一個很好的編程習慣,不會產生不必要的東西,對吧? – skuntsel

+0

我想,是的。很難說沒有特定的用例和代碼。如果您使用連接的實體,則不需要保存任何內容。只需修改實體的狀態,並且更改將自動保持。 –