我有一个实体,它有两个关系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列下降树。当它转向&#34; grandPa&#34;要保存weblogic会返回异常:
引起:org.hibernate.TransientObjectException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例
我无法理解为什么会这样。它在代码中对父设备有一些查询时给出了这个错误:第一个转为空,第二个转为一个值。 我使用weblogic 12.1.3和hibernate 4.0.0作为数据库Oracle 11g。
答案 0 :(得分:1)
在代码中,在父设备
上有一些查询时,它会给我这个错误
默认情况下,Hibernate会在尝试执行查询之前刷新对数据库的挂起更改。在此阶段,所有关系中引用的所有实体应该已保留,否则将引发异常。
此外,由于在mappedBy
端声明了children
,因此parents
是该关系的拥有方。因此,Hibernate将在持续时间完全忽略children
并在parents
中寻找瞬态实体。因此,你的坚持逻辑应该被颠倒过来 - 先保留父母,让孩子保持最后(或者你可以简单地声明children
拥有的一面)。