我在Person和Role类之间有OnetoMany关系。一个人可以有多个角色。当我创建一个新人时,角色(现有记录)应该使用人员ID进行更新。我正在使用CascadeType All的@OneToMany映射,但是Role类没有使用Person id进行更新。如果在创建Person时创建了一个新角色并将其设置为关系,则它可以正常工作。但是当您创建一个新Person并尝试将其设置为现有Role时,它不会更新。
答案 0 :(得分:0)
这必须手动完成双向链接。 hibernate教程提供了一个很好的例子:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#tutorial-associations-usingbidir
在您的情况下:在OneToMany方面,使您的setPersons(...)方法受到保护,并定义一个公共addPerson(Person p)方法,如下所示:
public void addPerson(Person p) {
this.getPersons().add(p);
p.setRole(this);
}
顺便说一句,如果一个人可以拥有多个角色,并且一个角色可以分配给多个人,那么很可能你真正想要的是ManyToMany关系。所以你有:
public void addPerson(Person p) {
this.getPersons().add(p);
p.getRoles().add(this);
}
在班上的人:
public void addRole(Role r) {
this.getRoles().add(r);
r.getPersons().add(this);
}
这是必要的,因为与EJB 2.x容器管理关系(CMR)相比,这不是自动处理的。 Hibernate使用POJO方法。 CMR的缺点是,它需要一个容器来创建对象,而您可以在任何地方创建POJO对象。如果你创建它们,它们只是普通的旧Java对象,没有技巧。
这是一篇很好的博客文章,进一步讨论了这个问题:http://blog.xebia.com/2009/03/16/jpa-implementation-patterns-bidirectional-assocations/