Sun Java System Application Server Platform Edition 9 リリースノート

Java Persistence API

この節では、Java Persistence API に関する既知の問題とその解決方法を示します。

WHERE 句でサブクエリーを使用する UPDATE または DELETE クエリーを行うと、クエリーのコンパイル中に NullPointerException が発生する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=572 を参照してください。

解決方法

この種のクエリーは使用しないでください。

クエリーコンパイラが、Java Persistence 言語仕様で定義されたすべてのルールをチェックしない。

クエリーコンパイラは、仕様の Java Persistence 言語の章で定義されたすべてのルールをチェックするわけではありません。具体的には、次のチェックは行われません。

無効なクエリーは、コンパイルできても実行時に SQLException が発生する可能性があります。また、配下のデータベースでは制約が少なく、生成された SQL がサポートされても、別のデータベースで同じクエリーを実行すると SQLException が発生して失敗する場合もあります。

解決方法

上の条件を手動で確認してください。

JOIN 変数別にグループ化し、JOIN 変数を直接選択するクエリーを行うと、SQLException が発生する。

JOIN 変数別にグループ化し、JOIN 変数を直接選択するクエリーを行うと、グループ化していない式が選択されていることを知らせる SQLException が発生する可能性があります。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=197 を参照してください。次に例を示します。


SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c

解決方法

JOIN 変数を定義するのではなく、たとえば次のように直接関係を結びます。


SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer

クエリーコンパイラが、間違ったトークンを示した紛らわしいエラーメッセージをスローする場合がある。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=550 を参照してください。

解決方法

クエリー内の間違いを手動で確認してください。

現在、同じクラスを含む 2 つの持続性ユニットを、同一の EAR ファイルに配備できない。

解決方法

異なるクラス名を使用してください。

persistence.xml のクラス要素を使用して、MappedSuperclass を明示的に一覧表示できない。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=558 を参照してください。

解決方法

MappedSuperclass の明示的な一覧表示はしないでください。

継承されたクラスで、@ManyToMany のエンティティーマッピングが失敗する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=578 を参照してください。

解決方法

サブクラスでは ManyToMany 関係を使用しないでください。

関係に List<> を使用すると、MetadataHelper.getAttributeNameFromMethodNameStringIndexOutOfBoundException が発生する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=557 を参照してください。

解決方法

代わりに java.util.Collection を使用してください。

Null のデータベース値をプリミティブにマップできない。

解決方法

Null にできるデータベース列にマップするには、Java ラッパータイプを使用してください。

クライアント側から LAZY 初期化関係にアクセスすると、NullPointerException が発生する場合がある。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=404 を参照してください。

解決方法

クライアントへインスタンスを返す前に、サーバー側コードで LAZY 初期化関係にアクセスしてください。

関係フィールドを選択するクエリーを行った場合、クエリー結果に Null が含まれない。

関係フィールドを選択するクエリーを行った場合、関係フィールドの値が Null のときにクエリー結果に Null が含まれません。このエントリはたとえば次のように、クエリー結果から省略されます。


SELECT o.customer FROM Order o WHERE ...

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=637 を参照してください。

解決方法

関連するインスタンスから状態フィールドを選択してください。


SELECT o.customer.customerId FROM Order o WHERE ...

単一値の関係フィールドに対して定義された JOIN 識別変数を選択するクエリーを行うと、無効な SQL になる場合がある。

次に例を示します。


SELECT c FROM Order o LEFT OUTER JOIN o.customer c

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=638 を参照してください。

解決方法

関連するインスタンスから状態フィールドを選択してください。


SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c

EntityManager.find() を行うと、誤って IllegalArgumentException が発生する。

主キークラスが @IdClass 注釈で定義されている場合、EntityManager.find() を行うと、別のエントリのサブクラスであるエンティティーに対して IllegalArgumentException が誤って発生します。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=595 を参照してください。

解決方法

find() メソッドへの引数として、最上位のスーパークラスのクラスを使用し、その結果をサブクラスへキャストしてください。

関係フィールドを java.util.HashSet に設定したエンティティーを持続できない。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=643 を参照してください。

解決方法

初期値として java.util.ArrayList を使用してください。