繁体   English   中英

注释映射与XML映射以及删除实体

[英]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);

其中上述EvaluationServiceRequest的子对象。 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仅在不尝试更新任何内容时才产生selectsdeletes

感觉好像我的注释映射错误,但是我无法弄清楚哪里出错了。 请帮忙。

我认为您需要指定级联注释。 不过要当心这个问题

您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM