JPA:在同一个实体上关联manyToMany

时间:2016-12-19 15:10:05

标签: java hibernate jpa

我有一个实体,它有两个关系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。

1 个答案:

答案 0 :(得分:1)

  

在代码中,在父设备

上有一些查询时,它会给我这个错误

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

此外,由于在mappedBy端声明了children,因此parents是该关系的拥有方。因此,Hibernate将在持续时间完全忽略children并在parents中寻找瞬态实体。因此,你的坚持逻辑应该被颠倒过来 - 先保留父母,让孩子保持最后(或者你可以简单地声明children拥有的一面)。