JPA / Hibernate级联删除不起作用

时间:2018-03-23 17:02:12

标签: hibernate jpa one-to-many cascade

我无法使用Hibernate JPA实现让cascase remove在Java EE容器托管应用程序中工作。帮助将不胜感激。 我有一个实体'公司',与其他实体有四个OneToMany关系。在测试应用程序时(使用Arquillian框架),我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。 我在这里读到:JPA and Hibernate Cascade DELETE OneToMany does not work这可能是一个测试问题,因此我在这里阅读了关于这个主题的每篇文章,并尝试了所有可能性,我现在认为它可能与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;
}

删除功能执行以下操作:

  • 合并要删除的公司
  • 获取列表
  • '找到'for循环中列表中的每个元素(EntityManager.find),然后将其删除(我也试过'合并',不起作用)
  • 将每个列表设置为null(不知道是否有必要,但在某些帖子中提到过)
  • 删除公司实体

提前致谢!

2 个答案:

答案 0 :(得分:0)

您需要提供@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)

答案 1 :(得分:0)

通过以错误的方式实施我的测试,结果证明这是我自己的错。让我解释一下我的测试内容:

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