注释映射与XML映射和删除实体

时间:2015-06-02 21:50:20

标签: java hibernate jpa wildfly-8

我正在使用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,使用 annotation 映射执行remove Hibernate生成查询以查找实体引用,然后在调用remove时产生更新,试图将Evaluation FK中的子记录更新回ServiceRequest为空:

Hibernate: update Evaluation set requestId=null where requestId=?

由于not null上存在requestId约束,因此会爆炸。

如果我使用XML映射执行相同的操作(参见上面的代码段),它可以正常工作。所有子实体都与父项一起删除。如果从不尝试更新任何内容,Hibernate只生成selectsdeletes

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

3 个答案:

答案 0 :(得分:1)

我认为您需要指定级联注释。小心this issue though

答案 1 :(得分:1)

你的xml配置实际上说你的ServiceRequest和Set之间的关系是双向的,因为inverse =“true”。

但是你的JPA注释是单向的。所以这应该工作(在OP评论后编辑)

@OneToMany(orphanRemoval=true,mappedBy="requestId")
@OrderBy("evalDate DESC")
private Set<Evaluation> evaluations = new TreeSet<>();

这里mappedBy="requestId"告诉Hibernate这是关系的所有者方面。因此,它将发布声明以删除评估。

答案 2 :(得分:0)

感谢@troy的某些方向。单独添加级联不起作用,但添加了heroku pg --app my-production-app heroku pg --app my-staging-app 。所以注释映射现在看起来像这样:

insertable=flase, updateable=false

我不确定为什么会有效,所以如果有人能解释,我会非常感激。

我间接地来到这里。首先,我在此映射中添加了@OneToMany(cascade=CascadeType.REMOVE) @JoinColumn(name = "requestId", insertable=false, updatable=false) @OrderBy("evalDate DESC") private Set<Evaluation> evaluations = new TreeSet<>(); ,当我部署它时,Hibernate抱怨它并告诉我,我需要在nullable-false实体上添加insert=false update=falserequestId。那种方式有效。我可以像我想的那样删除,但我无法保存或插入评估。我有点期待这件事发生。所以我只是厌倦了这个解决方案并且它运作