mysql - 多对一hibernate在删除一个时删除多个?

标签 mysql sql hibernate jpa

我有两个类(class)

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>

最佳答案

是的。将帐户中的 OneToMany 映射到发票。当您认为它需要一个连接表时,您就错了——它不需要。基于你想要一个 Invoice->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 允许缓存,但不会反射(reflect)数据库,如果你不这样做。

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

关于mysql - 多对一hibernate在删除一个时删除多个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25323478/

相关文章:

MySQL - 当 COUNT(*) 返回 null 时如何得到 0?

mysql - MySQL 中何时使用单引号、双引号和反引号

java - Hibernate中不同的保存方式有什么区别?

mysql - XAMPP 3.2.1 上的 Apache 和 Mysql 未启动

mysql - SELECT MAX(trans_id),Bank_state ,`Forwarded_to` FROM `t_support_details`

SQL:如何选择特殊字符之间的子字符串

java - 通过 Hibernate 保存实体时出现 org.hibernate.WrongClassException

php - 未找到类 'App\Http\Controllers\Project'

mysql - 创建名为 $email 的数据库表

java - 以编程方式在 JpaProperties 中添加 hibernate 拦截器 - Spring