この規則により、PERSIST、MERGE、または ALL というカスケード・ストラテジーを使用して関係を持つ JPA エンティティーを定義する JPA プロジェクトにフラグを立て、WebSphere Application Server V8.5 および Liberty における JPA 2.0 実装でのデフォルトの振る舞いの変更に関する注意を喚起します。 バージョン 8.5 より前では、パーシストをカスケードする場合、エンティティーが既に存在しているかどうかの確認のためデータベースがチェックされました。 新しいデフォルト動作では、最初にチェックせずに、エンティティーが既にデータベース内にある場合は、 「エンティティー・キーが既に存在します」パーシスタンス例外 をスローします。 この振る舞い変更の利点は、データベースへの余分なアクセスが回避されるので、パフォーマンスが向上するということです。
この振る舞い変更は、ほとんどのアプリケーションに影響がないと予想されます。 新規の振る舞いの利点を生かすために、コード変更を行うか、前の振る舞いに戻す前に、まずアプリケーションをバージョン 8.5 環境で試すことができます。
問題が発生した場合、またはアプリケーション
が永続操作するように書かれていて、まず
新しいエンティティをデータベースで検索、また新しい永続化例外の可能性
を処理しないことが分かっている場合は、openjpaを設定することにより、
以前の動作に戻すことができます。persistence.xml 内の Compatibility
プロパティー:
|
<persistence-unit name="name" transaction-type="JTA"> ... <properties> <property name="openjpa.Compatibility" value="checkDatabaseForCascadePersistToDetachedEntity=true"/> </properties> </persistence-unit> |
アプリケーションを変更したくない場合は、このプロパティーをサーバー JVM システム・プロパティーとして設定することもできます。
注意を喚起する上で役立つように、この可能性のあるアプリケーションの問題に関連した Java 規則および XML 規則があります。 カスケード・パーシストが複数の箇所で定義されていても、プロジェクトごとにフラグが立てられる結果は 1 つのみです。 これにより、この問題についてアプリケーション全体を評価できるようになります。
特に、EntityManager 操作の persist および merge の呼び出しを評価して、コードが振る舞い変更を正しく処理できるかどうかを判断する必要があります。
アプリケーションを評価したら、構成の分析でこの規則をオフにするか、生成された結果を無視することができます。
Java 規則は、関係アノテーションで定義された以下のいずれのカスケード・ストラテジーにもフラグを立てます。
例えば、@OneToOne などの関係アノテーション内でカスケード・タイプにフラグが立てられます。
|
@Entity public class Foo { private Bar bar; @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) public Bar getBar() { return bar; } } |
XML 規則は、orm.xml ファイルでエンティティーに対して定義された以下のいずれのカスケード・ストラテジーにもフラグを立てます。
|
<entity class="com.ibm.entities.Foo" access="FIELD"> <attributes> <one-to-one name="bar"> <cascade><cascade-persist/><cascade-merge/></cascade> </one-to-one> </attributes> </entity> |
これらの項目のどれにフラグが立てられている場合でも、persist または merge のカスケード・スタイルを使用して、エンティティーに対して merge または persist を呼び出しているコードを評価する必要があります。 新規エンティティーの挿入前に、アプリケーション・コードでまずデータベースのチェックが行われるようになっている場合、アプリケーションに振る舞いの変更が発生する可能性があります。
以下の openjpaを追加するとします。Compatibilityプロパティーは
persistence.xmlに追加し、分析を再度実行して、行動変更に
関連するチェックは新しい結果がないこと
を確認します。この行動変更はListAttribute ルールに関する JPA MetaModel コード生成であります。
詳細情報、