JPA カスケード・ストラテジーでの振る舞いの変更を確認する

この規則により、PERSIST、MERGE、または ALL というカスケード・ストラテジーを使用して関係を持つ JPA エンティティーを定義する JPA プロジェクトにフラグを立て、WebSphere Application Server V8.5 および Liberty における JPA 2.0 実装でのデフォルトの振る舞いの変更に関する注意を喚起します。 バージョン 8.5 より前では、パーシストをカスケードする場合、エンティティーが既に存在しているかどうかの確認のためデータベースがチェックされました。 新しいデフォルト動作では、最初にチェックせずに、エンティティーが既にデータベース内にある場合は、 「エンティティー・キーが既に存在します」パーシスタンス例外 をスローします。 この振る舞い変更の利点は、データベースへの余分なアクセスが回避されるので、パフォーマンスが向上するということです。

この振る舞い変更は、ほとんどのアプリケーションに影響がないと予想されます。 新規の振る舞いの利点を生かすために、コード変更を行うか、前の振る舞いに戻す前に、まずアプリケーションをバージョン 8.5 環境で試すことができます。

問題が発生した場合、あるいはアプリケーションがまずパーシスト操作でデータベース内で新規エンティティーを検索するように書かれていて、可能性のある新規のパーシスタンス例外を処理しないことが分かっている場合、persistence.xml 内で以下のように openjpa.Compatibility プロパティーを設定すれば、前の振る舞いに戻すことができます。

< span class="Code"> < persistence-unit name="name " transaction-type = "JTA ">
...
< span class= "indent2"> < /span> < のプロパティー>
<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 ファイルでエンティティーに対して定義された以下のいずれのカスケード・ストラテジーにもフラグを立てます。

< span class="Code"> < entity class= "com.ibm.entities.Foo" access="FIELD ">
< span class= "indent2"> < /span> < 属性>
< span class= "indent4"> < /span> < 1 対 1 の名前 =" bar">
<cascade><cascade-persist/><cascade-merge/></cascade>
</one-to-one>
</attributes>
</entity>

これらの項目のどれにフラグが立てられている場合でも、persist または merge のカスケード・スタイルを使用して、エンティティーに対して merge または persist を呼び出しているコードを評価する必要があります。 新規エンティティーの挿入前に、アプリケーション・コードでまずデータベースのチェックが行われるようになっている場合、アプリケーションに振る舞いの変更が発生する可能性があります。

openjpa.Compatibility プロパティーを persistence.xml に追加した場合、再度分析を実行して、関連の「 ListAttribute に関する JPA MetaModel コード生成での振る舞いの変更を確認する」という規則で新規の結果がないことを確認します。

詳細情報、