2016-02-26 32 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