Spring数据JPA / Hibernate删除错误

时间:2015-08-09 07:45:11

标签: spring hibernate jpa

我对jpa删除传播有一些奇怪的问题: 我有一个与对象C有一对多关系的对象A.我有另一个对象B与对象C(A-C和B-C)有一对一的关系 当我尝试删除“A'对象然后hibernate删除它而不删除它的C对象。但在此之前,它尝试使用第二关系商店选择C对象

这是日志:

Hibernate: select ... from A A0_ where A0_.external_id=?
Hibernate: select ... from C C0_ inner join B B1_ on C0_.B_id=B1_.id  where C0_.A_id=?
Hibernate: select ... from C C0_ inner join B B1_ on C0_.B_id=B1_.id  where C0_.B_id=?
Hibernate: delete from A where id=?

这是我的代码:

中的

@OneToOne(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private C c;

在B班:

@OneToMany(mappedBy = "b", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private List<C> cs;
C类中的

@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "a_id", nullable = false)
private A a;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "b_id", referencedColumnName = "id", nullable = false)
private B b;

我已经使用三个实体中的业务键重新定义了equals和hashCode方法

我使用spring数据jpa和hibernate

提前谢谢, Amrou

2 个答案:

答案 0 :(得分:1)

您必须从c中包含的A列表中删除cs中包含的B,因为如果删除的实体是Hibernate必须取消计划删除操作持久化(直接或通过级联PERSIST操作)。

JPA规范要求此行为;有关详细信息,请参阅此question

另外,您可能会发现此answer有用;它很好地描述了删除未安排的过程。

答案 1 :(得分:0)

我遇到与您提供的第一个链接中描述的问题相同的问题。
如你所说,我必须在删除b实体之前删除c实体。我期待hibernate会自动执行它,但它并不是因为C拥有的与One的OneToOne关系。
非常感谢你。