2013-05-09 15 views
5

JPAの使用CascadeTypesに関する質問があります。例のためJPAカスケードタイプの優先順位?

@ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) 

はこれに異なっている:

@ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 

なぜ? 参照クラスをエンティティクラス に自動的に挿入するには、cascadetype persistが必要です。私は テーブルに二重のエントリを持ちたくないので、私はマージが必要です。しかし、最初に永続性を定義すると、マージされません。 を最初にマージしても動作しません。

なぜですか?

+2

順番は重要ではないはず。プロバイダに問題があります.JPAに準拠しているか、呼び出し元のエンティティ構造に問題があり、永続化またはマージする必要があります。あなたは何をしているのですか? – Chris

+1

現在どのJPAプロバイダを使用していますか? – blitzen12

答えて

1

JPA仕様では、実際には非常に読みやすい文書であり、ここからダウンロードすることができます:

それインサイド

https://jcp.org/aboutJava/communityprocess/final/jsr317/index.html

ページ384の上に、それはManyToMany注釈のcascade属性について説明します

cascade要素は、関連付けられたエンティティに伝播される一連のカスケード操作を指定します( )。 カスケード可能な操作は、CascadeType enumによって定義されます。public enum CascadeType {ALL、PERSIST、MERGE、REMOVE、REFRESH、DETACH};値 のcascade = ALLは、cascade = {PERSIST、MERGE、REMOVE、REFRESH、 DETACH}と等価です。

ご覧のとおり、注文については何も言わない。おそらく、アプリケーションで永続化する必要がある新しいオブジェクトを使用することがあり、時にはマージする必要のあるデータベースからオブジェクトをロードすることがあります。つまり、アプリケーションの問題です。

個人的に私は、永続コンテキストでエンティティをマージするDIYアプローチを使用します。被写体に読んで良い記事はこちらです:

http://blog.xebia.com/2009/03/23/jpa-implementation-patterns-saving-detached-entities/