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;
}
删除函数执行以下操作:
- 合并要删除的公司
- 获取列表
- 'find' for循环中列表中的每个元素(EntityManager.find),并将其删除(我也试过'merge',不起作用)
- 将每个列表设置为空(不知道是否有必要,但在一些 post 中提到过)
- 删除公司实体
提前致谢!
您需要提供 @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)
事实证明这是我自己的错,以错误的方式实施了我的测试。让我解释一下我做了什么测试:
- 添加了一家公司(保存到数据库)
- 添加了联系信息、地址...(保存到数据库)
- 将这些添加到公司对象
- 忘记更新公司实体,所以地址、联系信息等在运行时链接到公司,但这些更改没有持久化
- 删除了公司和预期的联系人和地址,...被级联删除,这没有发生,因为我忘记更新了。
我无法使用 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;
}
删除函数执行以下操作:
- 合并要删除的公司
- 获取列表
- 'find' for循环中列表中的每个元素(EntityManager.find),并将其删除(我也试过'merge',不起作用)
- 将每个列表设置为空(不知道是否有必要,但在一些 post 中提到过)
- 删除公司实体
提前致谢!
您需要提供 @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)
事实证明这是我自己的错,以错误的方式实施了我的测试。让我解释一下我做了什么测试:
- 添加了一家公司(保存到数据库)
- 添加了联系信息、地址...(保存到数据库)
- 将这些添加到公司对象
- 忘记更新公司实体,所以地址、联系信息等在运行时链接到公司,但这些更改没有持久化
- 删除了公司和预期的联系人和地址,...被级联删除,这没有发生,因为我忘记更新了。