[英]Annotation mapping vs. XML mapping and deleting an entity
我正在将项目从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时,在适当的位置使用注释映射执行remove,Hibernate生成一个查询以查找Entity引用,然后在调用remove
时生成一个更新,以尝试将Evaluation
FK中的子记录更新为ServiceRequest为null:
Hibernate: update Evaluation set requestId=null where requestId=?
炸掉了,因为对requestId
约束not null
。
如果我使用XML映射执行相同的操作(请参见上面的代码段),则效果很好。 所有子实体均与父实体一起删除。 而Hibernate仅在不尝试更新任何内容时才产生selects
和deletes
。
感觉好像我的注释映射错误,但是我无法弄清楚哪里出错了。 请帮忙。
我认为您需要指定级联注释。 不过要当心这个问题 。
您的xml配置实际上说您的ServiceRequest和Set之间的关系是双向的,因为inverse =“ true”。
但是您的JPA注释是单向的。 所以这应该可以工作(在OP评论后编辑)
@OneToMany(orphanRemoval=true,mappedBy="requestId")
@OrderBy("evalDate DESC")
private Set<Evaluation> evaluations = new TreeSet<>();
在这里, mappedBy="requestId"
告诉Hibernate这是关系的所有者。 因此它将发布声明以删除评估。
感谢@troy的指导。 单独添加级联是行不通的,但是添加insertable=flase, updateable=false
却没有。 因此,注释映射现在如下所示:
@OneToMany(cascade=CascadeType.REMOVE)
@JoinColumn(name = "requestId", insertable=false, updatable=false)
@OrderBy("evalDate DESC")
private Set<Evaluation> evaluations = new TreeSet<>();
我不知道为什么会这样,所以如果有人能解释一下,我将非常感激。
我是间接到达这里的。 首先,我向该映射添加了一个nullable-false
,当我部署它时,Hibernate抱怨它,并告诉我我需要在Evaluation
实体上向requestId
添加insert=false update=false
。 这种工作。 我可以按照自己的意愿删除,但无法保存或插入评估。 我有点希望发生这种情况。 所以我只是累了这个解决方案,它奏效了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.