JavaEE TreeSet导致org.hibernate.TransientPropertyValueException

时间:2016-02-26 09:35:37

标签: java hibernate jpa java-ee sortedset

我有一个A类.A的树集为B. B的树集为C. C的HashSet为D.

我得到了这个例外:

  

引起:org.hibernate.TransientPropertyValueException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:D.c - > ç

我理解为什么我通常会得到那个例外。但在这种情况下我真的无法想象为什么,因为当我将B.cSortedSet的类型更改为普通集时,它将起作用。有人有想法吗?

可以在这里找到具有更好可读性的课程:

@Entity
public class A extends SortableEntity  {
    @OneToMany(mappedBy = „a“, cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    @OrderBy("sortOrder")
    public SortedSet<B> bSortedSet = new TreeSet<>();
}

@Entity
public class B extends SortableEntity  {
    @OneToMany(mappedBy = „b“, cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    @OrderBy("sortOrder")
    public SortedSet<C> cSortedSet = new TreeSet<>(); // Wont work.
    // public Set<C> cSet = new HashSet<>(); // Will work.

    @ManyToOne
    public A a;
}

@Entity
public class C extends SortableEntity  {
    @OneToMany(mappedBy = „c“, cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    public Set<D> dSet = new HashSet<>();

    @ManyToOne
    public B b;
}

@Entity
public class D  {
    @ManyToOne
    public C c;
}

@MappedSuperClass
public abstract class D  {
    @ManyToOne
    public Integer sortOrder;
}

注意:通常,属性都是私有的,并且它们具有getter和setter。实现了可比较,并且重写了相同的方法。

修改

Anil的回答是正确的。这似乎是问题,当树集重新排列它的元素时,它会破坏后向引用,它们需要再次持久化。这是我最好的想法。我没有证明这一点,但是通过操纵数据(以便集合不必自行排序),我可以使它工作。

1 个答案:

答案 0 :(得分:1)

如果您的实体中有一个集合,并且该集合中有一个或多个项目不在数据库中,则会发生这种情况。

对于上面的代码,它与@ManyToOne的CASCADE属性有关 使用cascade = CascadeType.PERSIST,并测试结果。

相关问题