JPA/Hibernate 级联删除不起作用

JPA/Hibernate cascade remove does not work

我无法使用 Hibernate JPA 实现在 Java EE 容器管理的应用程序中删除 cascase。帮助将不胜感激。 我有一个实体 'Company',与其他实体有四个 OneToMany 关系。在测试应用程序时(使用 Arquillian 框架),我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。 我在这里读到:JPA and Hibernate Cascade DELETE OneToMany does not work 这可能是一个测试问题,所以我在这里阅读了关于这个主题的所有 post 并尝试了每一种可能性,我现在认为它可能有一些东西使用 Arquillian 测试框架和正在(未)在测试部署中加载的 类。

我的公司实体如下所示:

public class CompanyEntity implements Serializable {

  private static final long serialVersionUID = 2L;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  @NotNull
  private String name;
  @NotNull
  private String companyCode;
  @OneToMany(targetEntity = ContactInfoEntity.class, cascade =   CascadeType.REMOVE, orphanRemoval = true)
  private List<ContactInfoEntity> contactInfo;
  @OneToMany(targetEntity = AddressEntity.class,cascade = CascadeType.REMOVE, orphanRemoval = true)
  private List<AddressEntity> addresses;
  @OneToMany(targetEntity = ConnectionInfoEntity.class,cascade = CascadeType.REMOVE, orphanRemoval = true)
  private List<ConnectionInfoEntity> connectionInformation;
  @OneToMany(targetEntity = PreferenceEntity.class,cascade = CascadeType.REMOVE, orphanRemoval = true)
  private List<CompanyPreferenceEntity> preferences;
}

我的实体都是这样定义的:

public class AddressEntity implements Serializable {
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  @NotNull
  @Size(min = 2)
  private String country;
  @NotNull
  @Size(min = 2)
  private String city;
  private String zipCode;
  private String street;
  private boolean isPrimaryAddress;
}

删除函数执行以下操作:

提前致谢!

您需要提供 @JoinColumn 注释来指示关系的所有者:

@OneToMany(targetEntity = ContactInfoEntity.class, cascade =   
  CascadeType.REMOVE, orphanRemoval = true)
@JoinColumn(name="company_id")
private List<ContactInfoEntity> contactInfo;

有关此类映射的更多信息,请参见此处:https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Unidirectional_OneToMany,_No_Inverse_ManyToOne,_No_Join_Table_(JPA_2.x_ONLY)

事实证明这是我自己的错,以错误的方式实施了我的测试。让我解释一下我做了什么测试:

  • 添加了一家公司(保存到数据库)
  • 添加了联系信息、地址...(保存到数据库)
  • 将这些添加到公司对象
  • 忘记更新公司实体,所以地址、联系信息等在运行时链接到公司,但这些更改没有持久化
  • 删除了公司和预期的联系人和地址,...被级联删除,这没有发生,因为我忘记更新了。