ヘッダーをスキップ
Oracle® Fusion Middlewareリリース・ノート
11gリリース1(11.1.1) for Linux x86
B55924-02
  ドキュメント・ライブラリへ
ドキュメント・ライブラリへ
製品リストへ
製品リストへ
目次
目次

戻る
戻る
 
次へ
次へ
 

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 アクセシビリティ

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

8.1.2.2 Windows OSでのTopLink Workbenchの実行

Windowsオペレーティング・システムの特定の構成およびバージョンの問題が原因で、workbench.cmdファイルでTopLink Workbenchを起動すると、「Could not find the main class」と記載されたダイアログが表示されることがあります。この問題は、指定されたクラスパスにピリオドを含むディレクトリ・パスが存在するために発生します。この問題を回避するには、原因となっているディレクトリの名前を変更するか、ピリオドを含まないディレクトリ・パスを使用するようにクラスパスを変更します。

8.1.3 TopLinkによるOracle Database拡張

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

8.1.3.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. 表8-1「Oracle Spatialのサポート」または表8-2「Oracle XDBのサポート」を使用して、コピーするファイルを決定します。

    表8-1 Oracle Spatialのサポート

    コピーするファイル コピー元脚注1  コピー先脚注2 

      sdoapi.jar

    <ORACLE_DATABASE_HOME>/md/jlib

    <WEBLOGIC_HOME>/server/lib


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

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

    表8-2 Oracle XDBのサポート

    コピーするファイル コピー元脚注1  コピー先脚注2 

      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. ウィザードの残りのページを完了します。

8.1.4 0(ゼロ)の値の主キーの許可

デフォルトで、EclipseLinkは、nullを使用できないプリミティブ型(intlongなど)で0(ゼロ)をnullとして解釈するため、0が主キーにとって無効な値となります。この設定は、persistence.xmlファイルのallow-zero-idプロパティを使用して変更できます。有効な値は次のとおりです。

  • true: EclipseLinkは、0(ゼロ)の値を0として解釈します。この設定により、主キーで0の値を使用できます。

  • false: (デフォルト)EclipseLinkは、0(ゼロ)をnullとして解釈します。

詳細は、http://wiki.eclipse.org/EclipseLink/UserGuideにあるEclipseLinkのユーザーズ・ガイドを参照してください。

8.1.5 JCA Oracle Databaseサービスと組み合されたSybaseの管理対象サーバー

クラスタ内でOracle Database Adapterと組み合せてJCAサービスを使用し、Sybaseデータベースに対してデータベース操作を実行する場合、クラスタ内の管理対象ノードは、メッセージを処理して、重複する操作を試行することがあります。

Sybaseのサポートされるバージョンでは、Oracle TopLinkのレコード・ロックに対応していないため、重複する操作の試行がSybaseで許可されます。

8.1.6 コンテナ管理のJPAを使用するEclipseLinkでのロギング構成

デフォルトで、コンテナ管理のJPAのEclipseLinkユーザーは、Oracle WebLogic Serverのロギング・オプションを使用して、EclipseLinkで生成されたすべてのログ・メッセージをレポートします。Oracle Fusion Middleware Oracle WebLogic Serverのログ・ファイルの構成およびログ・メッセージのフィルタに含まれる、WebLogicロギング・サービスの構成に関する項を参照してください。

EclipseLinkのネイティブ・ロギング構成を使用するには、次のプロパティをpersistence.xmlファイルに追加します。

<property name="eclipselink.logging.logger" value="DefaultLogger"/> 

8.1.7 JRockit JVMと組み合されたTopLink DBWS

TopLink DBWSデプロイメントでは、JRockit VM環境で障害が発生することがあります。デプロイメントのWARファイルの生成時に、TopLinkデータベースWebサービス(DBWS)の設計時ユーティリティは、Oracle WebLogic Server(WLS)10.3.3にバンドルされているJRockitのバージョンと互換性のないバージョンのコード生成用ASMを使用します。その結果、「Illegal target of jump or branch」というSOAPメッセージ例外とともにデプロイメント障害が発生します。


注意:

この問題は、Sun JVM環境でアプリケーション・サーバーを実行している場合には発生しません。

JRockit JVM環境に正常にデプロイできるDBWSデプロイメントのWARファイルを生成するには、次の手順を実行します。


注意:

この手順は、Oracle JDeveloperなどのIDEを使用して完了できます。

  1. 新規プロジェクトを作成します。クラスパスに次のライブラリを追加します。

    • Java EE

    • Oracle TopLink

    • Oracle JWSDL

    • Oracle SOAP

    • JAX-WS Webサービス

    • JDBCライブラリ

    • utils/dbws/eclipselink-dbwsutils.jar

  2. dbws-bulider.xmlファイルをインポートし、プロジェクト・クラスパスに追加します。

  3. プロジェクトのsrcディレクトリにMETA-INF/services/org.eclipse.persistence.tools.dbws.DBWSPackagerという名前の新規ファイルを作成します。ファイルには、次の1行を含める必要があります。

    org.eclipse.persistence.tools.dbws.JDevPackager
    

    この新しく作成したファイルをプロジェクト・クラスパスに追加します。

  4. DBWSBuilderユーティリティを使用して、指定のディレクトリにWebサービス・アーティファクトを生成します。

    • メイン・クラス: org.eclipse.persistence.tools.dbws.DBWSBuilder

    • 引数: -builderFile dbws-builder.xml -stageDir . -packageAs jdev

  5. プロジェクトを再ビルドします。これにより、DBWSProvider.classファイルが生成されます。

  6. Webサービス・アーティファクトを使用してWARデプロイメント・プロファイルを生成します。.warファイルには、次のものが含まれる必要があります。

    • WEB-INF/web.xml

    • WEB-INF/weblogic.xml

    • WEB-INF/classes/_dbws/DBWSProvider.class

    • WEB-INF/classes/META-INF/eclipselink-dbws.xml

    • WEB-INF/classes/META-INF/eclipselink-dbws-or.xml

    • WEB-INF/classes/META-INF/eclipselink-dbws-ox.xml

    • WEB-INF/classes/META-INF/eclipselink-dbws-sessions.xml

    • WEB-INF/wsdl/eclipselink-dbws.wsdl

    • WEB-INF/wsdl/eclipselink-dbws-schema.xsd

  7. これで、アプリケーション・サーバーにWARファイルをデプロイできます。