gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:24:27 25 4
gpt4 key购买 nike

我正在将项目从 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,使用 注释 映射就位执行删除,Hibernate 会生成一个查询来查找实体引用,然后当 remove被称为它产生一个更新,试图将 Evaluation FK 中的子记录更新回 ServiceRequest 为空:

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

由于 requestId 上有一个 not null 约束,所以会发生这种情况。

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

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

最佳答案

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

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

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

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

关于java - 注释映射与 XML 映射和删除实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com