我有一个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的答案是正确的。这似乎是问题,当树集正在重新排列它的元素时,它将销毁后面的引用,并且它们需要再次被持久化。这只是我最好的想法。我没有证据证明这一点,但是通过操纵数据(以便集合本身不能自行排序),我可以得到它的工作。
也许你的JPA提供程序只支持特定的集合类型,SortedSet不是其中之一吗?我在我的应用程序中使用的JPA提供程序(DataNucleus JPA)绝对支持SortedSet/TreeSet声明,但无法对其他人发表评论 –
TreeSet受支持。另一个运作良好。 – Maik639
另一种说法是,集合上的OrderBy是多余的,因为检索时的元素将由集合本身排序,而不是添加它们的顺序。 –