ヘッダーをスキップ
Oracle Fusion Middlewareリリース・ノート
11gリリース1(11.1.1) for AIX Based Systems(64-Bit)
B55935-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

8 Oracle TopLink

この章では、Oracle TopLinkに関連する問題について説明します。内容は次のとおりです。

8.1 一般的な問題および回避方法

この項では、一般的な問題および回避方法について説明します。内容は次のとおりです。

8.1.1 TopLinkオブジェクト・リレーショナルの問題

この項には、次の問題に関する情報が含まれます。

8.1.1.1 SQLServer2005での間違った外部結合SQL

TopLinkでは、SQL Server v2005に対して間違った外部結合が生成されます。生成される外部結合の構文は、このデータベースの以前のバージョンでは有効です。この制限を回避するには、データベースの互換性を再構成します(詳細は、SQLServerのドキュメントを参照してください)。別の方法として、カスタムTopLinkデータベース・プラットフォームを使用できます。

8.1.1.2 外部トランザクション制御でサポートされないUnitOfWork.release()

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();
    }
}

8.1.1.3 UPDATEのリターン・ポリシーとオプティミスティック・ロック

リターン・ポリシーを使用すると、INSERTおよびUPDATEの実行時に変更された値を返してキャッシュ済オブジェクトに移入できますが、このポリシーは、UPDATEで数値バージョンのオプティミスティック・ロックと組み合せると機能しません。すべてのUPDATE操作に対して返される値が1となり、意味のあるロック保護は提供されません。

UPDATEのリターン・ポリシーは、数値のオプティミスティック・ロックと組み合せて使用しないでください。

INSERTのリターン・ポリシーは、オプティミスティック・ロックの使用時に正常に機能します。

8.1.1.4 TimestampをStringとして返すJDBCドライバ

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
        );
    }
}

8.1.1.5 Oracle Containers for Java EE(OC4J)管理データソースでのプロキシ認証

プロキシ認証は、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));

8.1.1.6 作業ユニットで変更セットに削除オブジェクトが追加されない問題

作業ユニットの変更セットにアクセスして変更内容を確認する場合、削除保留中のオブジェクト(uow.deleteObject( )uow.deleteAllObjects( )など)は、結果セットから返されません。

削除保留中のオブジェクトは、作業ユニットのgetDeletedObjectsコールを通じてのみ取得できます。

8.1.2 TopLink Workbenchの問題

この項には、次の問題に関する情報が含まれます。

8.1.2.1 アクセシビリティ

IBM JDK 1.6の問題により、ファイルの保存時にNullPointExecptionエラー・ダイアログが生成された場合、そのエラー・ダイアログ・ウィンドウにフォーカスは置かれません。

8.1.3 TopLink Grid(Coherence統合)

この項には、次の問題に関する情報が含まれます。

8.1.3.1 遅延コレクション

属性レベルの変更追跡対応エンティティを使用している場合、遅延コレクションに対する変更は、コヒーレンス・キャッシュ内に反映されない可能性があります(変更イベントのみが記録されます)。この問題は、属性レベルの変更追跡が有効化されている場合にのみ発生し、永続性ユニット・プロパティeclipselink.weaving.changetrackingfalseに設定されている場合は発生しません。

推奨される問題の回避方法は、遅延コレクションを変更する前に、そのコレクションをsize()で取得することです。

8.1.3.2 読取り/書込み構成

コヒーレンス読取り/書込み構成を使用する場合、遅延ロードを使用するリレーションシップは、コヒーレンス・キャッシュに正しく書き込まれますが、データベースで更新されない可能性があります。

推奨される問題の回避方法は、リレーションシップを即時として構成することです。別の方法として、読取り/書込みのかわりにコヒーレンス読取り構成を使用できます。

8.1.4 TopLinkによるOracle Database拡張

この項には、次の問題に関する情報が含まれます。

8.1.4.1 Oracle WebLogic ServerでのSpatialおよびXDBサポート用のテンプレートJAR

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ドメインを拡張するには、次の手順を実行します。

  1. toplink-spatial-template.jarファイル(Oracle Spatialのサポート用)とtoplink-xdb-template.jarファイル(Oracle XDBのサポート用)を次の場所からダウンロードします。

  2. 次のファイルをコピーします。

    ファイル コピー元脚注1  コピー先脚注2 
    Oracle Spatialのサポート用:
      sdoapi.jar <ORACLE_DATABASE_HOME>/md/jlib <WEBLOGIC_HOME>/server/lib
    Oracle XDBのサポート用:
      xdb.jar <ORACLE_DATABASE_HOME>/rdbms/jlib <WEBLOGIC_HOME>/server/lib
      xml.jar <ORACLE_DATABASE_HOME>/lib <WEBLOGIC_HOME>/server/lib
      xmlparserv2.jar <ORACLE_DATABASE_HOME>/lib <WEBLOGIC_HOME>/server/lib

    脚注1 これらはデフォルトの場所です。実際の場所は、特定の環境、インストール済オプションおよびリリースに応じて変化する可能性があります。

    脚注2 Oracle JDeveloperに統合されたWebLogic Serverを使用する場合、<WEBLOGIC_HOME>は、<JDEVELOPER_HOME>ディレクトリ内に存在します。


    注意:

    実際のJARファイルの名前は、コピー元のディレクトリでは異なる可能性がありますが、コピー先のディレクトリにコピーする際には、前述のとおりの名前にする必要があります。

  3. 構成ウィザード(<WEBLOGIC_HOME>/common/bin/config.shまたは.bat)を起動します。

  4. 「既存のWebLogicドメインの拡張」を選択します。

  5. 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のドキュメントを参照してください。

  6. 「既存の拡張テンプレートを使用してドメインを拡張する」を選択します。

  7. 必要なテンプレートJARを参照して選択します(Oracle Spatialの場合はtoplink-spatial-template.jar、Oracle XDBの場合はtoplink-xdb-template.jar)。

  8. ウィザードの残りのページを完了します。