我在两个表之间有很多关系,并在hibernate中生成新的连接表 现在如何通过更新两个表在连接表中插入记录 说两个表是tbluser和tbldomain
我必须从两侧(即来自tbluser和tbldomain)在tbluserdomainrelation中插入记录
目前我只能在保存或更新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;
}
答案 0 :(得分:9)
我怀疑你可能会遇到第一道障碍:
如前所述,Hibernate将更新您调用update()
的对象,然后按照您在@Cascade
属性中指定的规则,级联到需要更新的任何后续对象。 / p>
问题是您的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 );
在这种情况下,我发现提供一个将对象添加到集合的辅助方法很有用,而不是直接访问集合本身。 e.g。
public class VirtualDomain {
Set userset;
/* snip... */
public void addUser( User user ) {
getUserset().add( user );
user.getVirtualdomainset().add( this );
}
}
虽然值得记住Hibernate前辈们的建议:
“在一个真实的系统中,你可能没有多对多的关联。我们的经验是,几乎每个链接都必须附加其他信息......最好的方式......是通过中间关联类。“ (Java Persistence With Hibernate,p.297 / 298,ISBN 1-932394-88-5)
答案 1 :(得分:0)
你的课程怎么样?
我想你有一个类Domain和一个User类。 在Domain类中,假设您有一个Users集合。将User对象添加到Users集合,并在Domain对象上调用SaveOrUpdate。 还要确保已指定正确的级联选项(例如cascading =“save-update”。
这有点大局。我们需要有关不起作用的更详细信息。
答案 2 :(得分:0)
您已将User类设为关系的所有者。如果你想转向其他方式,那么你需要切换它们的映射,以便Domaintable具有@JoinTable。或者您必须通过在Domaintable上使用@PrePersist或@PreUpdate手动强制它来强制调用User上的更新,该更新会将行插入到连接表中。我确信还有其他方法可以实现它,但这些是我想到的两个。
@PreUpdate example :
@EntityListeners( Domaintable.class )
@Entity
public class Domaintable
{
User user;
....
@PreUpdate
public void onPreUpdate( DomainTable domainTable )
{
if( domainTable.getUser() != null )
{
entitymanager.update( domainTable.getUser() );
}
}
....
}