gpt4 book ai didi

java - JPA:同一实体上的多对多关系

转载 作者:行者123 更新时间:2023-12-01 09:06:32 25 4
gpt4 key购买 nike

我有一个实体,它与其自身有两个关系 ManyToMany,但我不想使用 Cascade.MERGE,因为我需要进行一些数据检查来验证数据:

@Entity("device")
public class Device {
...
@ManyToMany(mappedBy = "parents", targetEntity = Device.class, fetch = FetchType.LAZY)
public Set<Device> getChildren() {
return this.children;
}

@Override
@ManyToMany(targetEntity = Device.class, fetch = FetchType.LAZY)
@JoinTable(name = "dem_hierarchy", joinColumns = {
@JoinColumn(name = "CHILDREN_UUID", referencedColumnName = "UUID")},
inverseJoinColumns = {
@JoinColumn(name = "DEM_DEVICE_UUID", referencedColumnName = "UUID")})
public Set<Device> getParents() {
return parents;
}

...
}

当我像这样保存一棵树时:

Device grandGrandPa = new Device();
grandGrandPa.setName("TEST" + counter + "_grandGrandPa");

Device grandPa = new Device();
grandPa.setName("TEST" + counter + "_grandPa");

grandGrandPa.addChild(grandPa);

Device daddy = new Device();
daddy.setName("TEST" + counter + "_daddy");

grandPa.addChild(daddy);

Device son = new Device();
son.setName("TEST" + counter + "_son");

daddy.addChild(son);
grandGrandPa = deviceService.register(grandGrandPa);

register 方法是递归的,它使用children 列沿树向下排列。当轮到“grandPa”被保存时,weblogic 返回一个异常:

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

我不明白为什么会发生这种情况。当代码中父设备上有一些查询时,它会给我这个错误:第一次它是空的,第二次它有一个值。我使用 weblogic 12.1.3 和 hibernate 4.0.0,作为数据库 Oracle 11g。

最佳答案

It gives me this error when in code there are some queries on parent Device

默认情况下,Hibernate 将在尝试执行查询之前将挂起的更改刷新到数据库。在此阶段,所有关系中引用的所有实体都应该被持久化,否则将引发异常。

此外,由于 mappedBy 是在 children 端声明的,因此 parents 是关系的拥有方。因此,Hibernate 将在持久化时完全忽略 children 并在 parents 中查找 transient 实体。因此,您的持久逻辑应该相反 - 首先保存 parent ,最后保存 child (或者,您可以简单地声明 children 为拥有方)。

关于java - JPA:同一实体上的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41225598/

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