我有一個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是多餘的,因爲檢索時的元素將由集合本身排序,而不是添加它們的順序。 –