この章では、Oracle TopLinkに関連する問題について説明します。内容は次のとおりです。
この項では、一般的な問題および回避方法について説明します。内容は次のとおりです。
この項には、次の問題に関する情報が含まれます。
TopLinkでは、SQL Server v2005に対して間違った外部結合が生成されます。生成される外部結合の構文は、このデータベースの以前のバージョンでは有効です。この制限を回避するには、データベースの互換性を再構成します(詳細は、SQLServerのドキュメントを参照してください)。別の方法として、カスタムTopLinkデータベース・プラットフォームを使用できます。
Java Transaction API(JTA)と同期している作業ユニットは、解放されると例外をスローします。現行のトランザクションでその変更を永続化しない場合、JTAトランザクションはロールバックする必要があります。
コンテナ境界型のトランザクションでは、EJB/セッション・コンテキストで次のようにsetRollbackOnly()
をコールします。
@Stateless public class MySessionBean { @Resource SessionContext sc; public void someMethod() { ... sc.setRollbackOnly(); } }
Bean境界型のトランザクションでは、EJB/セッション・コンテキストから取得したUserTransactionで次のようにrollback()
をコールします。
@Stateless @TransactionManagement(TransactionManagementType.BEAN) public class MySessionBean implements SomeInterface { @Resource SessionContext sc; public void someMethod() { sc.getUserTransaction().begin(); ... sc.getUserTransaction().rollback(); } }
リターン・ポリシーを使用すると、INSERT
およびUPDATE
の実行時に変更された値を返してキャッシュ済オブジェクトに移入できますが、このポリシーは、UPDATE
で数値バージョンのオプティミスティック・ロックと組み合せると機能しません。すべてのUPDATE
操作に対して返される値が1となり、意味のあるロック保護は提供されません。
UPDATE
のリターン・ポリシーは、数値のオプティミスティック・ロックと組み合せて使用しないでください。
INSERT
のリターン・ポリシーは、オプティミスティック・ロックの使用時に正常に機能します。
TopLinkでは、サーバーから返される日時の情報は、Timestamp
を使用しているものと仮定されます。JDBCドライバが現在の日付に対してString
を返すと、TopLinkは例外をスローします。これは、DB2 JDBCドライバの使用時に発生します。
この問題を回避するには、Timestamp
を返すドライバ(COM.ibm.db2.jdbc.app.DB2Driver
など)を使用するか、サーバー時間のかわりにローカル時間を使用するようにポリシーを変更してください。
別の回避方法は、次のようにプラットフォームで使用されるValueReadQuery
で問合せリダイレクタを使用することです。
ValueReadQuery vrq = new ValueReadQuery( "SELECT to_char(sysdate, 'YYYY-MM-DD HH:MM:SS.SSSSS') FROM DUAL" ); vrq.setRedirector(new TSQueryRedirector()); ... class TSQueryRedirector implements QueryRedirector { public Object invokeQuery(DatabaseQuery query, Record arguments, Session session) { String value = (String)session.executeQuery(query); return ConversionManager.getDefaultManager().convertObject( value, java.sql.Timestamp.class ); } }
プロキシ認証は、OC4J管理データソースでは機能しません。アプリケーション・サーバーにより提供されるデータソースを使用するかわりに、データソースを独自に作成する必要があります。
詳細は、『Oracle Fusion Middleware Oracle TopLink開発者ガイド』のOracle Databaseプロキシ認証の構成に関する項を参照してください。
たとえば、次のコードを置き換えます。
login.setConnector( new OracleJDBC10_1_0_2ProxyConnector( ((JNDIConnectorlogin.getConnector()).getName() ) );
次のように変更します。
oracle.jdbc.pool.OracleDataSource ds = new oracle.jdbc.pool.OracleDataSource(); ds.setUser("MyMainUser"); ds.setPassword("MyPassword"); ds.setUrl("jdbc:oracle:thin:@MyServer:1521:MyDb"); login.setConnector(new OracleJDBC10_1_0_2ProxyConnector(ds));
作業ユニットの変更セットにアクセスして変更内容を確認する場合、削除保留中のオブジェクト(uow.deleteObject( )
やuow.deleteAllObjects( )
など)は、結果セットから返されません。
削除保留中のオブジェクトは、作業ユニットのgetDeletedObjects
コールを通じてのみ取得できます。
この項には、次の問題に関する情報が含まれます。
Sun JDK 1.6の問題により、ファイルの保存時にNullPointExecptionエラー・ダイアログが生成された場合、そのエラー・ダイアログ・ウィンドウにフォーカスは置かれません。
Windowsオペレーティング・システムの特定の構成およびバージョンの問題が原因で、workbench.cmd
ファイルでTopLink Workbenchを起動すると、「Could not find the main class」と記載されたダイアログが表示されることがあります。この問題は、指定されたクラスパスにピリオドを含むディレクトリ・パスが存在するために発生します。この問題を回避するには、原因となっているディレクトリの名前を変更するか、ピリオドを含まないディレクトリ・パスを使用するようにクラスパスを変更します。
この項には、次の問題に関する情報が含まれます。
Oracle SpatialおよびOracle XDBマッピングの機能を(スタンドアロンのOracle WebLogic ServerとOracle JDeveloperに統合されたWebLogic Serverの両方で)完全にサポートするには、それぞれtoplink-spatial-template.jar
およびtoplink-xdb-template.jar
を使用してWebLogic Serverドメインを拡張し、Oracle SpatialとXDBをサポートする必要があります。
WebLogic Serverドメインを拡張するには、次の手順を実行します。
toplink-spatial-template.jar
ファイル(Oracle Spatialのサポート用)とtoplink-xdb-template.jar
ファイル(Oracle XDBのサポート用)を次の場所からダウンロードします。
表9-1「Oracle Spatialのサポート」または表9-2「Oracle XDBのサポート」を使用して、コピーするファイルを決定します。
表9-1 Oracle Spatialのサポート
コピーするファイル | コピー元脚注1 | コピー先脚注2 |
---|---|---|
sdoapi.jar |
|
|
脚注1 これらはデフォルトの場所です。実際の場所は、特定の環境、インストール済オプションおよびリリースに応じて変化する可能性があります。
脚注2 Oracle JDeveloperに統合されたWebLogic Serverを使用する場合、<WEBLOGIC_HOME>
は、<JDEVELOPER_HOME>
ディレクトリ内に存在します。
表9-2 Oracle XDBのサポート
コピーするファイル | コピー元脚注1 | コピー先脚注2 |
---|---|---|
xdb.jar |
|
|
xml.jar |
|
|
xmlparserv2.jar |
|
|
ori18n-mapping.jar脚注3 |
|
|
脚注1 これらはデフォルトの場所です。実際の場所は、特定の環境、インストール済オプションおよびリリースに応じて変化する可能性があります。
脚注2 Oracle JDeveloperに統合されたWebLogic Serverを使用する場合、<WEBLOGIC_HOME>
は、<JDEVELOPER_HOME>
ディレクトリ内に存在します。
脚注3 Oracle Database 11.2以上にはorai18n-mapping.jarを使用してください。
注意: 実際のJARファイルの名前は、コピー元のディレクトリでは異なる可能性がありますが、コピー先のディレクトリにコピーする際には、前述のとおりの名前にする必要があります。 |
構成ウィザード(<WEBLOGIC_HOME>
/common/bin/config.sh
または.bat
)を起動します。
「既存のWebLogicドメインの拡張」を選択します。
WebLogic Serverドメインを参照して選択します。
WebLogic Serverが統合されたJDeveloperを使用する場合、一般的なWebLogic Serverドメインの場所は、次のようになります。
Windows環境の場合: %APPDATA%\JDeveloper\systemXX.XX.XX.XX\DefaultDomain
XX.XX.XX.XX
は、一意の製品ビルド番号です。
Windowsプラットフォームでは、フォルダ・オプションの「すべてのファイルとフォルダを表示する」を選択する必要があります。
Windows以外の環境では、デフォルトの場所は、現在のユーザーのデフォルト・ホーム・ディレクトリ(<$Home>
/DefaultDomain
)内です。
詳細は、Oracle JDeveloperのドキュメントを参照してください。
「既存の拡張テンプレートを使用してドメインを拡張する」を選択します。
必要なテンプレートJARを参照して選択します(Oracle Spatialの場合はtoplink-spatial-template.jar、Oracle XDBの場合はtoplink-xdb-template.jar)。
ウィザードの残りのページを完了します。
デフォルトで、EclipseLinkは、nullを使用できないプリミティブ型(int
やlong
など)で0(ゼロ)をnullとして解釈するため、0が主キーにとって無効な値となります。この設定は、persistence.xml
ファイルのallow-zero-id
プロパティを使用して変更できます。有効な値は次のとおりです。
true: EclipseLinkは、0(ゼロ)の値を0として解釈します。この設定により、主キーで0の値を使用できます。
false: (デフォルト)EclipseLinkは、0(ゼロ)をnullとして解釈します。
詳細は、http://wiki.eclipse.org/EclipseLink/UserGuide
にあるEclipseLinkのユーザーズ・ガイドを参照してください。
クラスタ内でOracle Database Adapterと組み合せてJCAサービスを使用し、Sybaseデータベースに対してデータベース操作を実行する場合、クラスタ内の管理対象ノードは、メッセージを処理して、重複する操作を試行することがあります。
Sybaseのサポートされるバージョンでは、Oracle TopLinkのレコード・ロックに対応していないため、重複する操作の試行がSybaseで許可されます。
デフォルトで、コンテナ管理のJPAのEclipseLinkユーザーは、Oracle WebLogic Serverのロギング・オプションを使用して、EclipseLinkで生成されたすべてのログ・メッセージをレポートします。Oracle Fusion Middleware Oracle WebLogic Serverのログ・ファイルの構成およびログ・メッセージのフィルタに含まれる、WebLogicロギング・サービスの構成に関する項を参照してください。
EclipseLinkのネイティブ・ロギング構成を使用するには、次のプロパティをpersistence.xml
ファイルに追加します。
<property name="eclipselink.logging.logger" value="DefaultLogger"/>
必要なTopLink Gridラッパーが生成されるようにするには、グリッド・キャッシュとして構成されているエンティティに対してoracle.eclipselink.coherence.integrated.EclipseLinkJPACacheLoader
を構成する必要があります。