public interface JpaDialect extends PersistenceExceptionTranslator
一般に、このインターフェースを直接実装するのではなく、DefaultJpaDialect から派生させることをお勧めします。これにより、DefaultJpaDialect から共通の動作(現在および将来)を継承し、特定のフックをオーバーライドして、具体的なベンダー固有の動作をプラグインすることができます。
DefaultJpaDialect, JpaTransactionManager.setJpaDialect(org.springframework.orm.jpa.JpaDialect), JpaVendorAdapter.getJpaDialect(), AbstractEntityManagerFactoryBean.setJpaDialect(org.springframework.orm.jpa.JpaDialect), AbstractEntityManagerFactoryBean.setJpaVendorAdapter(org.springframework.orm.jpa.JpaVendorAdapter)| 修飾子と型 | メソッドと説明 |
|---|---|
ObjectSE | beginTransaction(EntityManagerEE entityManager, TransactionDefinition definition) 指定された JPA トランザクションを開始し、指定された Spring トランザクション定義で指定されたセマンティクス(特に、分離レベルとタイムアウト)を適用します。 |
void | cleanupTransaction(ObjectSE transactionData) 指定されたトランザクションデータを介してトランザクションをクリーンアップします。 |
ConnectionHandle | getJdbcConnection(EntityManagerEE entityManager, boolean readOnly) リレーショナルデータベースにアクセスする場合、指定された JPA EntityManager がそで使用する JDBC 接続を取得します。 |
ObjectSE | prepareTransaction(EntityManagerEE entityManager, boolean readOnly, StringSE name) 指定されたセマンティクスを適用して、JPA トランザクションを準備します。 |
void | releaseJdbcConnection(ConnectionHandle conHandle, EntityManagerEE entityManager) 最初に getJdbcConnection を介して取得された、指定された JDBC 接続を解放します。 |
translateExceptionIfPossible@Nullable ObjectSE beginTransaction(EntityManagerEE entityManager, TransactionDefinition definition) throws PersistenceExceptionEE, SQLExceptionSE, TransactionException
実装は、JPA トランザクションオブジェクトを構成してから begin を呼び出すか、分離レベルなどを取る特別な begin メソッドを呼び出すことができます。
実装では、読み取り専用フラグをフラッシュモードとして適用できます。その場合、以前のフラッシュモード(および場合によっては他のデータ)を保持するトランザクションデータオブジェクトを返し、cleanupTransaction でリセットできます。また、トランザクションを開始する前に、基になる JDBC 接続に読み取り専用フラグと分離レベルを適用する場合もあります。
実装では、渡された TransactionDefinition によって公開される Spring トランザクション名を使用して、特定のデータアクセスのユースケース(現在のトランザクション名をユースケース識別子として効果的に使用する)に最適化することもできます。
このメソッドは、Spring の SavepointManager インターフェースを実装するオブジェクトを返すことにより、永続性プロバイダーによってサポートされている場合、セーブポイント機能を公開することもできます。JpaTransactionManager は、必要に応じてこの機能を使用します。
entityManager - JPA トランザクションを開始する EntityManagerdefinition - セマンティクスを定義する Spring トランザクション定義 cleanupTransaction(java.lang.Object) に渡される)。SavepointManager インターフェースを実装できます。PersistenceExceptionEE - JPA メソッドによってスローされた場合 SQLExceptionSE - JDBC メソッドによってスローされた場合 TransactionException - 無効な引数の場合 cleanupTransaction(java.lang.Object), EntityTransaction.begin()EE, DataSourceUtils.prepareConnectionForTransaction(java.sql.Connection, org.springframework.transaction.TransactionDefinition)@Nullable ObjectSE prepareTransaction(EntityManagerEE entityManager, boolean readOnly, @Nullable StringSE name) throws PersistenceExceptionEE
実装では、読み取り専用フラグをフラッシュモードとして適用できます。その場合は、cleanupTransaction でリセットするために、以前のフラッシュモード(およびその他のデータ)を保持するトランザクションデータオブジェクトを返すことができます。
実装では、Spring トランザクション名を使用して、特定のデータアクセスのユースケースを最適化することもできます(現在のトランザクション名をユースケース識別子として効果的に使用します)。
entityManager - JPA トランザクションを開始する EntityManagerreadOnly - トランザクションが読み取り専用であるかどうか name - トランザクションの名前 (もしあれば)PersistenceExceptionEE - JPA メソッドによってスローされた場合 cleanupTransaction(java.lang.Object)void cleanupTransaction(@Nullable ObjectSE transactionData)
たとえば、実装では、基になる JDBC 接続の読み取り専用フラグと分離レベルをリセットできます。さらに、公開されたデータアクセスのユースケースをここでリセットできます。
transactionData - トランザクションデータを保持する任意のオブジェクト(存在する場合) (beginTransaction または prepareTransaction によって返される)beginTransaction(javax.persistence.EntityManager, org.springframework.transaction.TransactionDefinition), DataSourceUtils.resetConnectionAfterTransaction(java.sql.Connection, java.lang.Integer, boolean)@Nullable ConnectionHandle getJdbcConnection(EntityManagerEE entityManager, boolean readOnly) throws PersistenceExceptionEE, SQLExceptionSE
releaseJdbcConnection メソッドに渡されます。JPA は基盤となる JDBC 接続を取得する標準的な方法を提供しないため、この戦略が必要です(JPA 実装がリレーショナルデータベースでまったく機能しない可能性があるため)。
実装では、ラップされていない Connection オブジェクト、つまり、接続プールから取得した Connection を返すことをお勧めします。これにより、アプリケーションコードが、OracleConnection などの基になるネイティブ JDBC 接続に到達しやすくなります。これは、LOB 処理などに必要になる場合があります。コードの呼び出しは、返された接続オブジェクトを適切に処理する方法を知っていると想定しています。
返された Connection が EntityManager で自動的に閉じられる、または Connection オブジェクト自体を介して解放できる単純なケースでは、実装は Connection のみを含む SimpleConnectionHandle を返すことができます。releaseJdbcConnection で他のオブジェクトが必要な場合、実装ではその他のオブジェクトを参照する特別なハンドルを使用する必要があります。
entityManager - 現在の JPA EntityManagerreadOnly - 接続が読み取り専用の目的でのみ必要かどうか releaseJdbcConnection または null に渡される、コネクションのハンドル PersistenceExceptionEE - JPA メソッドによってスローされた場合 SQLExceptionSE - JDBC メソッドによってスローされた場合 releaseJdbcConnection(org.springframework.jdbc.datasource.ConnectionHandle, javax.persistence.EntityManager), ConnectionHandle.getConnection(), SimpleConnectionHandle, JpaTransactionManager.setDataSource(javax.sql.DataSource)void releaseJdbcConnection(ConnectionHandle conHandle, EntityManagerEE entityManager) throws PersistenceExceptionEE, SQLExceptionSE
getJdbcConnection を介して取得された、指定された JDBC 接続を解放します。取得した接続ハンドルを適切に解放できるように、これはどのような場合でも呼び出す必要があります。JPA トランザクションが完了したとき、または EntityManager が閉じられたときに getJdbcConnection によって返された接続が暗黙的に閉じられる場合、実装は単に何もしない場合があります。
conHandle - 解放する JDBC 接続ハンドル entityManager - 現在の JPA EntityManagerPersistenceExceptionEE - JPA メソッドによってスローされた場合 SQLExceptionSE - JDBC メソッドによってスローされた場合 getJdbcConnection(javax.persistence.EntityManager, boolean)