如何在多对多hibernate注释的连接表中插入记录?

时间:2009-05-09 09:23:45

标签: hibernate

我在两个表之间有很多关系,并在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;
}

3 个答案:

答案 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() );
    }
}

....

}