2013-10-17 82 views
7

我有兩個JPA實體類似這樣的JPA級聯持久性:與實體ElementCollection鍵

@Entity 
class Foo { 
    @Id 
    private long id; 
    // ... 
} 

@Entity 
class Bar { 
    @ElementCollection(targetClass = String.class, fetch = FetchType.LAZY) 
    @MapKeyJoinColumn(name = "foo_id", referencedColumnName = "id") 
    @MapKeyClass(Foo.class) 
    @Column(name = "content") 
    @CollectionTable(name = "bar_foo_content", 
        joinColumns = @JoinColumn(name = "bar_id", referencedColumnName = "id")) 
    @ManyToMany(cascade = CascadeType.ALL) 
    private Map<Foo, String> fooContent = Maps.newHashMap(); 
    // ... 
} 

正如你所看到的,fooContent場形成BarFoo之間的許多一對多的關係,所以我認爲這將適合使用@ManyToMany來指定該字段的級聯。然而,試圖堅持一個Bar與一對夫婦在地圖Foo → String值的時候,我得到以下異常:

javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: <<instance of Foo>> 

顯然,的EclipseLink不級聯我Foo實例的持久性。我應該如何註釋fooContent以使級聯持續運行?

+0

你的'Foo'是怎麼樣的?異常看起來像'Foo'和另一個實體之間存在問題。 – Uooo

+0

@Uooo錯誤仍然發生在上面的確切代碼(即Foo內沒有更多字段) – dflemstr

+0

我遇到了同樣的問題。你有沒有找到任何解決方案? – drame

回答

2

這裏不需要@ManyToMany註釋。對ElementCollection的操作始終級聯。

+0

即使沒有'@ ManyToMany'也會拋出異常 – dflemstr

4

同時指定@ElementCollection@ManyToMany是錯誤的。兩個註釋表示OR映射多於一個基數關係的不同概念。

ElementCollection是一個嚴格的聚合或合成關係,其中集合中的元素完全由它們的父對象擁有,並且任何與元素的交互(如查詢等)都必須通過父對象完成。父母與集合中元素的多樣性總是一對多。元素實例可以在給定時間點與只有一個父項相關聯。

ManyToMany代表或多或少的獨立實體之間的關係,它們可以單獨查詢和操縱,並且獨立於聲明用@ManyToMany註釋的屬性的實例。 ManyToMany關係暗示相關實例可以通過其他已聲明關係與任意數量的其他實例相關。

我期望任何符合標準的JPA實現都會顯示錯誤,或者顯示像這樣註釋的屬性的「未定義」行爲。