多对一休眠删除时删除多个?

时间:2014-08-15 08:33:33

标签: mysql sql hibernate jpa

我有两个班级

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>

2 个答案:

答案 0 :(得分:1)

是。将账户中的OneToMany映射到发票。当你认为它需要一个连接表时你错了 - 它没有。根据您希望拥有Invoice-&gt; Account ManyToOne关系,您可以重复使用此关系:

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

@Entity
Class Invoice{
  @ManyToOne
  Account account;
}

这些设置表示如果您删除帐户,JPA也会删除所有引用的发票。由于Invoice.account关系中没有级联设置,因此删除发票不会影响该帐户。也就是说,您应该在删除发票实例时从Account.invoice集合中删除发票。 JPA不会为您维护双向关系,因此当您修改双向关系的一方时,您还需要修改另一方以使您的对象模型与数据库保持同步 - JPA允许缓存赢得&#39;如果你没有反映数据库。

你可以看到很多关于这种关系的教程,但我发现最简单的解释是: 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;
}

答案 1 :(得分:0)

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