我有两个域对象,像这样:无法删除JPA实体是一个@ManyToOne关系的一部分
@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;
}
我来在我的逻辑中,我需要对数据库中实际保存的内容进行重大更改。即某些组织正在被删除,并且其中的员工正在重新分配。
我的问题是我的程序逻辑目前执行以下操作:
- 删除需要通过
org.springframework.data.repository.delete(Iterable<? extends T> itrbl)
- 要删除任何员工删除需要通过
org.springframework.data.repository.delete(Iterable<? extends T> itrbl)
- 要删除的任何机构]通过
org.springframework.data.repository.save(Iterable<S> itrbl)
- 创建新/更新现有的组织
org.springframework.data.repository.save(Iterable<S> itrbl)
问题涉及约在步骤2中我得到这样一个例外:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException:对象引用一个未保存 例如瞬时 - 保存在 flushing之前的瞬态实例:com.sample.domain.Employee.org - > com.sample.domain.Org; 嵌套的例外是java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:对象引用一个未保存 例如瞬时 - 前 冲洗保存瞬态的实例:com.sample.domain.Employee.org - > com.sample.domain .Org
如果组织没有员工,我不想删除组织。同样,如果组织的员工被删除,我不希望该组织被删除。
我基本上只是想东西是一样的,我是怎么在PostgreSQL的外键设置在employees
表:
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指向它,那么只需清除“员工”中的Org链接...删除Org的前一个。 –
@NeilStockton - 谢谢,这只是我需要的指针(一直盯着这个问题太长时间才看到明显的!)。如果你想发表你的评论作为答案,我会很乐意接受它。 – Catchwa