2017-04-05 150 views
0

我有两个域对象,像这样:无法删除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; 
} 

我来在我的逻辑中,我需要对数据库中实际保存的内容进行重大更改。即某些组织正在被删除,并且其中的员工正在重新分配。

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

  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:对象引用一个未保存 例如瞬时 - 保存在 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关系不是真正的父母 - 它是孩子),它不是双向的(不需要组织拥有一个列表其所有员工)

+1

你不想要级联,因为你已经说过自己不想删除相关对象。因此,如果需要删除一个Org,但仍然有一个FK指向它,那么只需清除“员工”中的Org链接...删除Org的前一个。 –

+0

@NeilStockton - 谢谢,这只是我需要的指针(一直盯着这个问题太长时间才看到明显的!)。如果你想发表你的评论作为答案,我会很乐意接受它。 – Catchwa

回答

2

你不想要cascade,sin你说你自己不希望删除相关的对象(这就是级联所做的)。

如果Org需要被仍然删除有FK指向它,然后就空出来的Employee(S)的链接Org ...之前删除Org的。您可以通过JPQL查询来检索链接到特定Org的所有Employee对象,然后清空它们的关系字段。或者,批量更新可以一次完成(但要小心内存中的对象,因为它们需要refresh()调用它们来获取FK的这种归零)。