当前位置: 首页 > 知识库问答 >
问题:

JPA/Hibernate级联删除不起作用

慕容俭
2023-03-14

我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所以我读到了这里关于这个主题的每一篇文章,并尝试了每一种可能性,我现在认为这可能与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;
}

delete函数执行以下操作:

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

提前道谢!

共有1个答案

敖子安
2023-03-14

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

 类似资料:
  • 我一直在阅读一篇又一篇的帖子和文章,试图让级联删除在最新的Spring Boot版本中与JPA/Hibernate配合使用。我读过你必须使用Hibernate特定的级联,我读过你不需要。我读过它们就是不起作用,但它似乎是一个混合体。我尝试过的一切都不起作用。这种关系是双向的。 不工作: 不工作: 在删除品牌之前,除了删除税率之外,还有什么其他方法有效吗? 我的测试如下所示: 参考错误: 原因:or

  • 我有两个实体业务,由一个部门列表组成。 当我尝试删除一个业务实例时,我得到一个Mysql异常 无法删除或更新父行:外键约束失败(

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建