2011-03-28 50 views
3

我有一個非常簡單的設置來嘗試與註釋的雙向映射:休眠雙向@ManyToOne,更新不擁有側不工作

@Entity 
public class TypeA extends AbstractModel<TypeA> { 

    @Id 
    @GeneratedValue 
    private int id; 

    @OneToMany(mappedBy="a") 
    private Collection<TypeB> bs; 

    // Getters & Setters ... 
} 

@Entity 
public class TypeB extends AbstractModel<TypeB> { 

    private static final long serialVersionUID = -3526384868922938604L; 

    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne() 
    @JoinColumn(name="a_id") 
    private TypeA a; 
} 

當我設置屬性TypeA.bs這不會影響映射,儘管它應該。請參閱以下示例:

TypeB b = new TypeB(); 
this.typeBDao.save(b); 

TypeA a = new TypeA(); 
a.setBs(ListUtils.createList(b)); 

System.out.println(a.getBs()); // output: [[email protected]] 

this.typeADao.save(a); 

System.out.println(a.getBs()); // output: [[email protected]] 

this.typeADao.refresh(a); 

System.out.println(a.getBs()); // output: [] 

this.typeBDao.refresh(b); 
System.out.println(b.getA()); // output: null 

如果映射是雙向的,則應該填充集合並且b的屬性a應該更新,但它不是。有任何想法嗎?

編輯感謝您的幫助,現在我明白了!

回答

9

因爲你始終將關係雙方一致的領域模型,如下所示:

TypeB b = new TypeB(); 

TypeA a = new TypeA(); 
a.setBs(ListUtils.createList(b)); 
b.setA(a); 

this.typeBDao.save(b); 
this.typeADao.save(a); 

當你的實體是不一致的狀態,JPA將始終根據該對象的狀態存儲值擁有JPA關係的一面。在這種情況下,TypeB擁有與TypeA的關係。因此,如果TypeB的對象沒有對TypeA的引用,那麼JPA假定沒有定義關係。

+0

這是正常的,請參閱我在此線程中的回答以及名稱'mappedBy'和'擁有方'的原因,如果我們沒有定義擁有方,GOTCHAs會發生什麼情況 - http://stackoverflow.com /問題/ 2749689 /什麼,是最擁有方 - 中安-ORM映射/ 21068644#21068644 – 2014-01-12 22:02:46

6

這是它應該工作的方式:擁有方是擁有該關係的方,並且負責在數據庫中管理它。開發人員(即您的責任)有責任確保您的對象圖始終保持一致:如果關係的一方被修改,那麼另一方也應該被修改。

如果你不總是這樣做,你必須至少確保修改關係的擁有方,因爲Hibernate只在乎擁有方..

1

的擁有方是TypeB,所以你需要致電setA(),因爲該關聯僅由擁有方管理。