0

大企業では、私たちのチームは Oracle DB のデータにアクセスするための API を提供しています。これまではプレーン SQL (JDBC) を使用してデータベースのデータを取得/書き込みしていました。したがって、既存の API のほとんどはこのように見えました (わかりました、必ずしもそれほど愚かではありません :-)

public class DummyApi {

    private final DataSource datasource;

    public DummyApi(javax.sql.DataSource datasource) {
        this.datasource = datasource;

    }

    public void doSomething() throws SQLException {
         Connection connection = datasource.getConnection();
         PreparedStatement statement = connection.prepareStatement("plain sql query");
         statement.execute();
    }
}

このような API の使用は簡単です。エンド アプリケーションがプレーンな Java SE、Spring、または JavaEE であるかどうかは問題ではありません。さらに、トランザクション API は、この API と適切に連携します。Spring TransactionManager (TransactionAwareDataSourceProxy と一緒に) および CMA-Java EE アプリケーションの JTA でそれらを使用します。

現在、新しい API で JPA を使用することを評価しています。そして、私たちが現在苦労している大きな問題は次のとおりです。エンドアプリケーションが JPA について知る必要がないように、単純なインターフェースをどのように提供できるでしょうか? EntityManager を DataSource で初期化するにはどうすればよいですか (たとえば、コンストラクターのパラメーターとして提供されます)。また、古いプレーンな JDBC-API と新しい JPA-API が同じトランザクション (エンド アプリケーションでの開始/ロールバック) にある場合、どのようにロールバックできますか?

問題について少し光を当ててくれてありがとう!

4

1 に答える 1

1

JPA では、データソースは通常、persistence.xml に設定されます。ある種の動的データソースが必要な場合は、DataSource をプロパティとして Persistence.createEntityManagerFactory() に渡すことができます。

ほとんどの JPA プロバイダーは、JDBC を混在させたい場合に JDBC 接続を取得する方法を提供します。通常、これには em.unwrap(Connection.class) を使用してアクセスします。JTA または Spring を使用して、トランザクションで同じ接続を共有することもできます。

于 2013-09-10T14:45:36.233 に答える