我有两个表之间的多对多关系并在 hibernate 中生成新的连接表
现在如何通过更新两个表在连接表中插入记录
说两个表是 tbluser 和 tbldomain
我必须从双方的 tbluserdomainrelation 中插入记录(即来自 tbluser 和 tbldomain)
目前我只能在保存或更新 tbluser 时在连接表中插入记录,但我想要
当我也更新域表中的关系时要插入的记录
在 user.class
我已经写了
@ManyToMany(targetEntity = VirtualDomain.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER)
@JoinTable(name = "tblUserDomainRel", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "domainid"))
public Set<VirtualDomain> getVirtualdomainset() {
return virtualdomainset;
}
public void setVirtualdomainset(Set<VirtualDomain> virtualdomainset) {
this.virtualdomainset = virtualdomainset;
}
在域表中我有条目
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class)
public Set<User> getUserset() {
return userset;
}
public void setUserset(Set<User> userset) {
this.userset = userset;
}
最佳答案
我怀疑你可能会跌倒在第一个障碍:
如前所述,Hibernate 将更新您调用 update()
的对象。按照您在 @Cascade
中指定的规则,然后向下级联到任何需要更新的后续对象。属性。
问题是你的 User
类拥有关系并添加一个 User
反对 VirtualDomain.userset
收藏不会改变 User
以任何方式反对。因此,即使使用级联,Hibernate 也不会更新 User
对象,因为它认为不必这样做。
相反,当您向 VirtualDomain.userset
添加对象时收藏,确保VirtualDomain
已添加到 User.virtualdomainset
收藏也是如此。
// given a VirtualDomain object
VirtualDomain domain = getSession().load( VirtualDomain.class, 1234 );
// and a User object
User user = getSession().load( User.class, 5678 );
// add the User to the VirtualDomain
domain.getUserset().add( user );
// but also add the VirtualDomain to the user
user.getVirtualdomainset().add( domain );
// update the VirtualDomain and the Cascade settings will also update the User
getSession().update( domain );
在这种情况下,我发现提供一种用于将对象添加到集合的辅助方法很有用,而不是使用对集合本身的直接访问。例如
public class VirtualDomain {
Set userset;
/* snip... */
public void addUser( User user ) {
getUserset().add( user );
user.getVirtualdomainset().add( this );
}
}
虽然值得记住 Hibernate 前辈的建议:
"In a real system, you may not have a many-to-many association. Our experience is that there is almost always other information that must be attached to each link... the best way... is via an intermediate assocation class." (Java Persistence With Hibernate, p. 297/298 , ISBN 1-932394-88-5)
关于hibernate - 如何在多对多 hibernate 注释的连接表中插入记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843020/