我正在将项目从XML映射迁移到基于纯JPA批注的映射,并且在尝试删除(删除)以及实体及其子项时遇到问题。它适用于XML映射,不适用于注释映射。注解映射与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设置为BARF了其SQL,执行与到位的Hibernate的注释映射删除生成的查询来查找实体引用,然后在remove
被称为它产生的更新试图更新子在Evaluation
FK回ServiceRequest记录为空:
Hibernate: update Evaluation set requestId=null where requestId=?
这打击了,因为有上requestId
一个not null
约束。
如果我使用XML映射执行相同的操作(请参阅上面的代码片段),它工作得很好。所有子实体都与父级一起删除。而休眠只产生selects
和deletes
,如果从未尝试更新什么。
这感觉就像我有注解映射错误,但我无法确定我出错的地方。请帮忙。
谢谢,这是正确的方向,稍作修改。在Hibernate中进行映射更改后,抱怨使用'mappedBy'和'@ JoinColumn'两个例外:'标记为mappedBy的关联不能像@JoinTable或@JoinColumn那样定义数据库映射:hci.hrccadmin.model.ServiceRequest.evaluations' 。然后删除'@ JoinColumn'后,它不喜欢'mappedBy =“ServiceRequest”',所以我将它改为'mappedBy =“requestId”',因为这是将ServiceRequest连接到评估的FK,并且似乎工作。似乎有点奇怪,但我想这是有道理的。 –
谢谢@sarahthebutterfly的答案。它真的再次移动。 –