2011-09-02 38 views
0

例如我有以下兩個實體類有一個一對多的關係:如何有效地合併@OneToMany關係?

public class A implements Serializable { 
    ... 
    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL) 
    private List<B> bs; 
    ... 
} 

public class B implements Serializable { 
    ... 
    @ManyToOne 
    private A a; 
    ... 
} 

假設我有A稱爲a,並且a.bs == [b1, b2, b3]一個實例。現在我想從b1中刪除,並將b4添加到關係中,以便a.bs == [b2, b3, b4]b1.a == null

我試過em.merge(a)後做a.setBs(b2, b3, b4),但這將導致a.bs == [b1, b2, b3, b4],除非我做了明確的b1.setA(null)。然而,如果a.bs改變很多,並且A與其他實體類具有更多的一對多關係,這可能會導致複雜性。設置orphanRemoval = true也不是解決方案,因爲我只是想設置b1.a = null而不是刪除b1

這個問題令我感到困惑,因爲很長一段時間退出,任何幫助我的人都非常感謝!

回答

0

可以設置級聯樣式更新bsa.bs.remove(b1); session.update(a);

這會做的伎倆。

您告訴ORM級聯集合上的更新,當您從集合中刪除條目時,相應的值將被取消。

+0

是否有任何JPA API而不是Hibernate特定的API實現相同?至少'EntityManager.merge'不起作用。 –

+0

合併操作會查看第一級緩存中是否存在類似對象,如果找到則返回對象的合併副本或將此對象添加到第一級緩存中並返回它......它不會執行任何級聯。 –