2016-02-26 171 views
0

我有一个A.类具有B. B的一个TreeSet已下的C TreeSet中有D.JavaEE的TreeSet中引起org.hibernate.TransientPropertyValueException

的一个HashSet

我得到这个异常:

造成的:org.hibernate.TransientPropertyValueException:对象引用一个未保存的瞬态的实例 - 冲洗之前保存的瞬态的实例:直流 - “ç

我明白为什么我通常会得到那个例外。但在这种情况下,我真的无法想象为什么,因为当我将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。 Comparable被实现并且等同的方法被覆盖。

编辑:


Anil的答案是正确的。这似乎是问题,当树集正在重新排列它的元素时,它将销毁后面的引用,并且它们需要再次被持久化。这只是我最好的想法。我没有证据证明这一点,但是通过操纵数据(以便集合本身不能自行排序),我可以得到它的工作。

+0

也许你的JPA提供程序只支持特定的集合类型,SortedSet不是其中之一吗?我在我的应用程序中使用的JPA提供程序(DataNucleus JPA)绝对支持SortedSet/TreeSet声明,但无法对其他人发表评论 –

+0

TreeSet受支持。另一个运作良好。 – Maik639

+0

另一种说法是,集合上的OrderBy是多余的,因为检索时的元素将由集合本身排序,而不是添加它们的顺序。 –

回答

1

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

对于上面的代码,它必须处理@ManyToOne的CASCADE属性 使用cascade = CascadeType.PERSIST,并测试结果。

+1

解决了我的问题。但为什么我需要为后向引用添加级联类型?当最顶层的实体被保存时,级联应该也保存所有其他实体。为什么这只会影响树集而不是哈希集? – Maik639