2013-10-17 18 views
7

私はこのような2つのJPAエンティティ持っている:あなたが見ることができるように、fooContentフィールドはBarFoo間の多対多の関係を形成しているので、私はそれを考えエンティティElementCollectionキーでJPAのカスケード永続

@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(); 
    // ... 
} 

をフィールドのカスケードを指定するのに@ManyToManyを使用するのが適切でしょう。

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インスタンスの持続性をカスケードしない:マップ内Foo → String値のカップルとBarを保持しようとしたときしかし、私は次の例外を取得します。カスケード接続を継続するには、fooContentに注釈を付ける必要がありますか?

+0

あなたの 'Foo'はどのように見えますか? 'Foo'と別のエンティティとの間に問題があるような例外があります。 – Uooo

+0

@Uooo上記の正確なコードでもバグがまだ発生しています(つまり、Foo内にフィールドがない) – dflemstr

+0

同じ問題が発生しました。あなたはまだ解決策を見つけましたか? – drame

答えて

2

ここに@ManyToMany注釈は必要ありません。 ElementCollectionの操作は常にカスケードされます。

+0

例外は '@ ManyToMany'がなくてもスローされます。 – dflemstr

4

@ElementCollection@ManyToManyの両方を同時に指定するとエラーになります。 2つの注釈は、1つ以上のカーディナリティー関係をORマッピングするという異なる概念を示しています。

ElementCollectionは、コレクション内の要素が親オブジェクトによって厳密に所有されている厳密な集約または構成の関係であり、クエリなどのような要素とのやりとりは、親を介して行わなければなりません。コレクションの要素に対する親の多重度は、常に1対多です。要素のインスタンスは、特定の時点で1つの親にのみ関連付けることができます。

ManyToManyは、@ManyToManyと注釈されたプロパティを宣言するインスタンスから個別に独立して照会および操作できる多かれ少なかれ独立したエンティティ間の関係を表します。 ManyToManyの関係は、関連するインスタンスが他の宣言された関係によって任意の数の他のインスタンスに関連する可能性があることを意味します。

標準に準拠したJPA実装では、このようにアノテーションされたプロパティに対してエラーが表示されたり、「未定義」の動作が発生することが予想されます。

関連する問題