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

标签 hibernate

我有两个表之间的多对多关系并在 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/

相关文章:

java - HibernateUtil 在 GlassFish 上工作,但不在 Tomcat 上工作

java - 使用 Hibernate、JPA 建立一对多关系

java - hibernate 中的 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

java - Hibernate 左连接使用 with

hibernate - Maven 和 pom.xml

java - 在hibernate spring中是否可以从DataAccessException接收URL?

java - 如何在外键上进行双向一对一关联

java - 具有常规数据库操作的多用户 Web 应用程序

java - 在 Java 中使用 MySQL 事件调度程序

java - 按 varchar 字段中存储的整数值对表进行排序