【问题标题】:Many-To-One hibernate delete the many when delete the one?多对一休眠删除多个时删除一个?
【发布时间】:2014-08-15 08:33:32
【问题描述】:

我有两门课

Account
id.
....

Invoice
id...
....
account_id (many to one)

由于一个用户存在许多发票,并且需要一个用户,因此我在发票中写了多对一。 我相信级联意味着如果我删除发票,那么它将通过尝试添加更新/删除等来影响帐户。

但是删除一个帐户有外键,这意味着它不能被删除,除非我先删除所有发票。

一种解决方法是在帐户中使用一对多/连接表,但我宁愿使用多对一,因为发票需要帐户。

我可以在 orm 中设置一个设置来表示: 如果我删除发票,帐户不会发生任何事情。 如果我删除一个帐户,与之关联的所有发票都会被删除

目前::

  <many-to-one name="account" fetch="EAGER" 
               target-entity="UserAccount">
      <join-column name="account_id"/>
      <cascade><cascade-all/></cascade>
  </many-to-one>

【问题讨论】:

    标签: mysql sql hibernate jpa


    【解决方案1】:

    是的。将帐户中的 OneToMany 映射到发票。当您认为它需要一个连接表时,您就错了——它不需要。基于您希望拥有 Invoice->Account ManyToOne 关系,您可以重用此关系:

    @Entity
    Class Account {
      @OneToMany(cascade=ALL, mappedBy="account")
      List<Invoice> invoices;
    }
    
    @Entity
    Class Invoice{
      @ManyToOne
      Account account;
    }
    

    这些设置意味着如果您删除帐户,JPA 也会删除所有引用的发票。由于 Invoice.account 关系上没有级联设置,因此删除 Invoice 不会影响帐户。也就是说,您应该在删除发票实例时从 Account.invoice 集合中删除发票。 JPA 不会为您维护双向关系,因此当您修改双向关系的一侧时,您还需要修改另一侧以使您的对象模型与数据库同步 - JPA 允许缓存不会反映如果您不这样做,请访问数据库。

    对于这种关系,您可以查看许多教程,但我找到的最简单的解释是: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Relationship_Mappings/Collection_Mappings/OneToMany

    如果您不希望它是双向的(即您不希望 Invoice.account 引用),我相信 JPA 2.0 允许您在 OneToMany 上使用 @JoinColumn 注释:

    @Entity
    Class Account {
      @OneToMany(cascade=ALL)
      @JoinColumn(name="account_id")
      List<Invoice> invoices;
    }
    

    【讨论】:

      【解决方案2】:

      我可以建议的一件事是在数据库的外键关系中设置级联删除。这样,当一个帐户被删除时,所有相关的发票都将被轻松删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 2012-05-13
        相关资源
        最近更新 更多