2011-03-28 53 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(),因为该关联仅由拥有方管理。