【发布时间】:2015-08-16 21:41:51
【问题描述】:
我正在将项目从 XML 映射迁移到基于纯 JPA 注释的映射,并且在尝试删除(删除)实体及其子项时遇到问题。它适用于 XML 映射,不适用于注释映射。
XML 映射如下所示:
<set name="evaluations" order-by="evalDate desc" table="Evaluation" lazy="true" inverse="true" cascade="delete">
<key column="requestId" />
<one-to-many class="org.stuff.model.Evaluation" />
</set>
注解映射,据我所知是这样的:
@OneToMany(orphanRemoval=true)
@JoinColumn(name = "requestId")
@OrderBy("evalDate DESC")
private Set<Evaluation> evaluations = new TreeSet<>();
这是一种单向关系。
删除实体的JPA代码是:
ServiceRequest sr = em.getReference(ServiceRequest.class, id);
em.remove(sr);
上面的Evaluation 是ServiceRequest 的子对象。 Hibernate 4.3.7 是我正在使用的 JPA Impl,在 WildFly 8.2 上运行。
Hibernate 设置为排除其 SQL,使用 annotation 映射执行删除 Hibernate 会生成一个查询来查找实体引用,然后当调用 remove 时,它会生成一个更新尝试将Evaluation FK 中的子记录更新回 ServiceRequest 为空:
Hibernate: update Evaluation set requestId=null where requestId=?
因为not null 对requestId 的约束,所以这会爆炸。
如果我使用 XML 映射(参见上面的 sn-p)执行相同的操作,它就可以正常工作。所有子实体与父实体一起被删除。如果从不尝试更新任何东西,Hibernate 只会产生selects 和deletes。
这感觉就像我的注释映射错误,但我不知道哪里出错了。请帮忙。
【问题讨论】:
标签: java hibernate jpa wildfly-8