java - 无法删除属于 @ManyToOne 关系的 JPA 实体

标签 java hibernate jpa spring-boot spring-data-jpa

我有两个域对象,如下所示:

@Entity
public class Employee {
  @Id
  @Column(nullable = false, name = "id")
  protected Integer id;

  // Note: org_id is just an integer column in the database
  @JoinColumn(nullable = true, name = "org_id")
  @ManyToOne(targetEntity = Org.class)
  private Org org;
}

...和:

@Entity
public class Org {
  @Id
  @Column(nullable = false, name = "id")
  protected Integer id;
}

我的逻辑遇到了这样的情况,我需要对数据库中实际保存的内容进行一些重大更改。即一些组织被删除,其中的员工被重新分配。

我遇到的问题是我的程序逻辑当前执行以下操作:

  1. 删除任何需要通过 org.springframework.data.repository.delete(Iterable<? extends T> itrbl) 删除的员工
  2. 删除任何需要通过 org.springframework.data.repository.delete(Iterable<? extends T> itrbl) 删除的组织
  3. 通过 org.springframework.data.repository.save(Iterable<S> itrbl) 创建新组织/更新现有组织
  4. 通过 org.springframework.data.repository.save(Iterable<S> itrbl) 创建新员工/更新现有员工

问题出现在第 2 步。我收到如下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.sample.domain.Employee.org -> com.sample.domain.Org; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.sample.domain.Employee.org -> com.sample.domain.Org

如果组织最终没有员工,我不想删除该组织。同样,如果组织的员工被删除,我也不希望该组织被删除。

我本质上只是想要与我在 employees 上的 PostgreSQL 中设置外键相同的东西。表:

  CONSTRAINT fk_employees_org_id FOREIGN KEY (org_id)
      REFERENCES public.orgs (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE SET NULL

我查看了级联选项,我不确定它是否适用,因为它不是直接的父/子关系(并且定义 Employee 关系的 @ManyToOne 并不是真正的父 -它是子级)并且它不是双向的(组织不需要拥有其所有员工的列表)

最佳答案

您不需要级联,因为您自己说过您不希望删除相关对象(这就是级联所做的全部)。

如果需要删除某个 Org,但仍有 FK 指向它,则只需将 Employee 中指向该 Org 的链接置空即可code>(s) ... 在删除 Org 之前。您可以通过 JPQL 查询来检索链接到特定 Org 的所有 Employee 对象,然后将其关系字段清空。或者,批量更新可以一次性完成(但要小心内存中的对象,因为它们需要 refresh() 调用它们来获取 FK 的清零)。

关于java - 无法删除属于 @ManyToOne 关系的 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225558/

相关文章:

java - 高级搜索

java - hibernate 一对一 : Forced to chose between optional = false or cascade?

java - 通过 tomcat 部署 Drools 失败

hibernate - 获取 javax.transaction.RollbackException : Prepare: NO vote with Atomikos JTA

java - Infinispan事务-无法从Spring4获取TransactionManager

java - 抛出应用程序异常会导致TransactionalException

Java泛型方法通配符不匹配问题

java - PowerMockito 与 TestNG 和 Mockito 框架

java - 使用 Hibernate 将 Oracle 日期映射到 Java 对象

java - @LazyCollection(LazyCollectionOption.FALSE) 和@OneToMany(fetch = FetchType.EAGER) 之间的区别