【问题标题】:How can I insert a record in join table of a many to many hibernate annotation?如何在多对多休眠注释的连接表中插入记录?
【发布时间】:2009-05-09 09:23:45
【问题描述】:

我在两个表之间有多对多关系并在休眠中生成新的连接表 现在如何通过更新两个表在连接表中插入记录 说两个表是 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;
}

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    我怀疑你可能会在第一个障碍中跌倒:

    如前所述,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 祖先的建议:

    “在真实系统中,您可能没有多对多关联。我们的经验是,几乎总是有其他信息必须附加到每个链接……最好的方法……是通过中间关联类。" (Java Persistence With Hibernate,第 297/298 页,ISBN 1-932394-88-5)

    【讨论】:

      【解决方案2】:

      你的课程怎么样?

      我想你有一个类域和一个类用户。 在 Domain 类中,假设您有一个 Users 集合。将 User 对象添加到 Users 集合,并在 Domain 对象上调用 SaveOrUpdate。 还要确保您指定了正确的级联选项(例如 cascading="save-update"。

      这是一个有点大的画面。我们需要更详细的信息来了解哪些方面不起作用。

      【讨论】:

      • 在域 bean 中我有映射 @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class) public Set getUserset() { 返回用户集;在用户 bean 中我有映射 @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 getVirtualdomainset() { return virtualdomainset; }
      • 两个类中都有 setter 方法,但由于大小限制,我没有包括在内。我可以通过调用用户的保存或更新方法正确插入,但我不能通过调用域表的保存或更新方法插入记录。那么我该如何实现呢。
      • 您可以编辑您的问题以提供更多详细信息。这也更具可读性。 :)
      【解决方案3】:

      您已将 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() );
          }
      }
      
      ....
      
      }
      

      【讨论】:

      • 我如何使用 prePersist 注释请告诉我我必须在这个标签中分配什么值
      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2015-09-27
      相关资源
      最近更新 更多