public class HibernateTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, BeanFactoryAware, InitializingBean
SessionFactory
の PlatformTransactionManager
実装。指定されたファクトリから Hibernate セッションをスレッドにバインドし、潜在的にファクトリごとに 1 つのスレッドバインドセッションを許可します。SessionFactory.getCurrentSession()
は、このトランザクション処理メカニズムをサポートする必要がある Hibernate アクセスコードに必要です。SessionFactory は SpringSessionContext
で構成されています。カスタム分離レベルと、Hibernate トランザクションタイムアウトとして適用されるタイムアウトをサポートします。
このトランザクションマネージャーは、トランザクションデータアクセスに単一の Hibernate SessionFactory を使用するアプリケーションに適していますが、トランザクション内での直接 DataSource アクセス(つまり、同じ DataSource で動作するプレーンな JDBC コード)もサポートします。これにより、Hibernate にアクセスするサービスとプレーンな JDBC を使用するサービスを混合できます(Hibernate を意識することなく)。アプリケーションコードは、DataSourceTransactionManager
と同じ単純な接続ルックアップパターン(つまり、DataSourceUtils.getConnection(javax.sql.DataSource)
または TransactionAwareDataSourceProxy
を経由する)に固執する必要があります。
メモ: プレーン JDBC コードの DataSource の接続を登録できるようにするには、このインスタンスが DataSource(setDataSource(javax.sql.DataSource)
)を認識している必要があります。与えられた DataSource は明らかに与えられた SessionFactory によって使用されたものと一致するはずです。
JTA(通常は JtaTransactionManager
を使用)は、同じトランザクション内の複数のトランザクションリソースにアクセスするために必要です。Hibernate が使用する DataSource は、このようなシナリオで JTA 対応にする必要があります(コンテナーのセットアップを参照)。
このトランザクションマネージャーは、JDBC 3.0 セーブポイントを介してネストされたトランザクションをサポートします。ただし、ネストされたトランザクションは JDBC 接続にのみ適用され、Hibernate セッションとそのキャッシュされたエンティティオブジェクトおよび関連コンテキストには適用されないため、AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean)
"nestedTransactionAllowed"} フラグはデフォルトで "false" に設定されます。Hibernate トランザクションに参加する JDBC アクセスコードにネストされたトランザクションを使用する場合は、フラグを手動で "true" に設定できます (JDBC ドライバーがセーブポイントをサポートしている場合)。Hibernate 自体はネストされたトランザクションをサポートしていないことに注意してください。Hibernate アクセスコードが意味的にネストされたトランザクションに参加することは期待しないでください。
setSessionFactory(org.hibernate.SessionFactory)
, setDataSource(javax.sql.DataSource)
, SessionFactory.getCurrentSession()
, DataSourceUtils.getConnection(javax.sql.DataSource)
, DataSourceUtils.releaseConnection(java.sql.Connection, javax.sql.DataSource)
, JdbcTemplate
, DataSourceTransactionManager
, JtaTransactionManager
, 直列化された形式 logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
コンストラクターと説明 |
---|
HibernateTransactionManager() 新しい HibernateTransactionManager インスタンスを作成します。 |
HibernateTransactionManager(SessionFactory sessionFactory) 新しい HibernateTransactionManager インスタンスを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
protected DataAccessException | convertHibernateAccessException(HibernateException ex) 指定された HibernateException を org.springframework.dao 階層からの適切な例外に変換します。 |
protected void | disconnectOnCompletion(Session session) トランザクションの完了時に既存の Hibernate セッションを切断し、データベース接続を返しますが、エンティティの状態は保持します。 |
protected void | doBegin(ObjectSE transaction, TransactionDefinition definition) 指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。 |
protected void | doCleanupAfterCompletion(ObjectSE transaction) トランザクション完了後にリソースをクリーンアップします。 |
protected void | doCommit(DefaultTransactionStatus status) 指定されたトランザクションの実際のコミットを実行します。 |
protected ObjectSE | doGetTransaction() 現在のトランザクション状態のトランザクションオブジェクトを返します。 |
protected void | doResume(ObjectSE transaction, ObjectSE suspendedResources) 現在のトランザクションのリソースを再開します。 |
protected void | doRollback(DefaultTransactionStatus status) 指定されたトランザクションの実際のロールバックを実行します。 |
protected void | doSetRollbackOnly(DefaultTransactionStatus status) 指定されたトランザクションをロールバックのみに設定します。 |
protected ObjectSE | doSuspend(ObjectSE transaction) 現在のトランザクションのリソースを一時停止します。 |
DataSourceSE | getDataSource() このインスタンスがトランザクションを管理する JDBC DataSource を返します。 |
Interceptor | getEntityInterceptor() 現在の Hibernate エンティティインターセプターを返します。存在しない場合は null を返します。 |
ObjectSE | getResourceFactory() このトランザクションマネージャーが動作するリソースファクトリを返します。 |
SessionFactory | getSessionFactory() このインスタンスがトランザクションを管理する SessionFactory を返します。 |
protected boolean | isExistingTransaction(ObjectSE transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。 |
protected SessionFactory | obtainSessionFactory() 実際に使用するために SessionFactory を取得します。 |
void | setAllowResultAccessAfterCompletion(boolean allowResultAccessAfterCompletion) 通常、Hibernate の ScrollableResults メカニズムを介して、完了後に結果アクセスを許可するかどうかを設定します。 |
void | setAutodetectDataSource(boolean autodetectDataSource) LocalSessionFactoryBean の setDataSource を介して設定されている場合、Hibernate SessionFactory によって使用される JDBC DataSource を自動検出するかどうかを設定します。 |
void | setBeanFactory(BeanFactory beanFactory) Bean ファクトリは、エンティティインターセプター Bean 名を解決するために必要なだけです。 |
void | setDataSource(DataSourceSE dataSource) このインスタンスがトランザクションを管理する JDBC DataSource を設定します。 |
void | setEntityInterceptor(Interceptor entityInterceptor) データベースへの書き込みおよびデータベースからの読み取りを行う前に、プロパティ値をインスペクションおよび変更できる Hibernate エンティティインターセプターを設定します。 |
void | setEntityInterceptorBeanName(StringSE entityInterceptorBeanName) データベースへの書き込みおよびデータベースからの読み取りを行う前に、プロパティ値をインスペクションおよび変更できる Hibernate エンティティインターセプターの Bean 名を設定します。 |
void | setHibernateManagedSession(boolean hibernateManagedSession) Spring 管理のセッションではなく Hibernate 管理のセッションを操作するかどうか、つまり、 SessionFactory.openSession() ではなく Hibernate の SessionFactory.getCurrentSession() を介してセッションを取得するかどうかを設定します(Spring TransactionSynchronizationManager チェックを前に付けます)。 |
void | setPrepareConnection(boolean prepareConnection) トランザクション Hibernate セッションの基盤となる JDBC 接続を準備するかどうか、つまり、基盤となる JDBC 接続にトランザクション固有の分離レベルやトランザクションの読み取り専用フラグを適用するかどうかを設定します。 |
void | setSessionFactory(SessionFactory sessionFactory) このインスタンスがトランザクションを管理する SessionFactory を設定します。 |
void | setSessionInitializer(ConsumerSE<Session> sessionInitializer) この HibernateTransactionManager によって管理される新しいトランザクション用に作成されたすべての Hibernate Session リソースをカスタマイズするためのコールバックを指定します。 |
commit, determineTimeout, getDefaultTimeout, getTransaction, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, newTransactionStatus, prepareForCommit, prepareSynchronization, prepareTransactionStatus, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransaction
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
commit, getTransaction, rollback
public HibernateTransactionManager()
public HibernateTransactionManager(SessionFactory sessionFactory)
sessionFactory
- トランザクションを管理する SessionFactorypublic void setSessionFactory(@Nullable SessionFactory sessionFactory)
@Nullable public SessionFactory getSessionFactory()
protected final SessionFactory obtainSessionFactory()
null
)IllegalStateExceptionSE
- SessionFactory セットがない場合 public void setDataSource(@Nullable DataSourceSE dataSource)
SessionFactory が LocalDataSourceConnectionProvider で構成されている場合、つまり、指定された "dataSource" を持つ Spring の LocalSessionFactoryBean によって構成されている場合、DataSource は自動検出されます。DataSource を明示的に指定することもできますが、この場合は指定する必要はありません。
この DataSource のトランザクション JDBC 接続は、DataSourceUtils または JdbcTemplate を介してこの DataSource に直接アクセスするアプリケーションコードに提供されます。接続は Hibernate セッションから取得されます。
ここで指定する DataSource は、TransactionAwareDataSourceProxy ではなく、トランザクションを管理するターゲット DataSource である必要があります。データアクセスコードのみが TransactionAwareDataSourceProxy で機能しますが、トランザクションマネージャーは基になるターゲット DataSource で機能する必要があります。それでも TransactionAwareDataSourceProxy が渡された場合、ターゲット DataSource を抽出するためにラップ解除されます。
注: Hibernate のキャッシュからデータを読み取るだけの(そして実際にはデータベースにアクセスしない)トランザクションが多いシナリオでは、実際のターゲット DataSource に LazyConnectionDataSourceProxy
を使用することを検討してください。または、"prepareConnection"
を false
に切り替えることを検討してください。どちらの場合も、このトランザクションマネージャーは、各 Hibernate セッションの JDBC 接続を先行して取得しなくなります(Spring 5.1 以降)。
@Nullable public DataSourceSE getDataSource()
public void setAutodetectDataSource(boolean autodetectDataSource)
setDataSource
を介して設定されている場合、Hibernate SessionFactory によって使用される JDBC DataSource を自動検出するかどうかを設定します。デフォルトは "true" です。Hibernate トランザクションをその DataSource の JDBC トランザクションとして公開しないために、使用可能な DataSource を意図的に無視するためにオフにすることができます。
public void setPrepareConnection(boolean prepareConnection)
デフォルトは "true" です。このフラグをオフにすると、トランザクションマネージャーはトランザクションごとの分離レベルをサポートしなくなります。また、読み取り専用トランザクションの場合も Connection.setReadOnly(true)
を呼び出しません。このフラグをオフにすると、接続設定は変更されないため、トランザクション後に JDBC 接続をクリーンアップする必要はありません。
public void setAllowResultAccessAfterCompletion(boolean allowResultAccessAfterCompletion)
デフォルトは "false" です。このフラグをオンにすると、基礎となる JDBC 接続でオーバーコミットの保持が強制され("prepareConnection"
がオンの場合)、完了時の切断ステップがスキップされます。
public void setHibernateManagedSession(boolean hibernateManagedSession)
SessionFactory.openSession()
ではなく Hibernate の SessionFactory.getCurrentSession()
を介してセッションを取得するかどうかを設定します(Spring TransactionSynchronizationManager
チェックを前に付けます)。デフォルトは "false" です。つまり、Spring 管理のセッションを使用します。現在のスレッドにバインドされたセッションが利用可能な場合(たとえば、Open-Session-in-View シナリオ)、現在のトランザクションの新しいセッションを作成します。
Hibernate 管理のセッションの使用を強制するには、このフラグを "true" に切り替えます。これには、SessionFactory.getCurrentSession()
が Spring 管理のトランザクションに対して呼び出されたときに常に適切なセッションを返す必要があることに注意してください。getCurrentSession()
呼び出しが失敗すると、トランザクションの開始は失敗します。
通常、このモードは、Spring の TransactionSynchronizationManager 以外の場所にセッションを保存するカスタム Hibernate CurrentSessionContext
実装と組み合わせて使用されます。また、Spring の Open-Session-in-View サポート(Spring のデフォルト SpringSessionContext
を使用)と組み合わせて使用することもできます。この場合、Spring 管理のセッションモードとは微妙に異なります。事前バインドセッションは clear()
呼び出しを受信しません(このようなシナリオでは、ロールバック時)または disconnect()
呼び出し(トランザクション完了時)。これはむしろ、カスタム CurrentSessionContext の実装に任されています(必要な場合)。
public void setSessionInitializer(ConsumerSE<Session> sessionInitializer)
HibernateTransactionManager
によって管理される新しいトランザクション用に作成されたすべての Hibernate Session
リソースをカスタマイズするためのコールバックを指定します。これにより、アプリケーションの目的で便利なカスタマイズが可能になります。Hibernate フィルターの設定。
Session.enableFilter(java.lang.String)
public void setEntityInterceptorBeanName(StringSE entityInterceptorBeanName)
セッションの作成時に Bean 名をインターセプターインスタンスに解決できるようにするには、Bean ファクトリを知っている必要があります。通常、プロトタイプインターセプター、つまりセッションごとの新しいインターセプターインスタンスに使用されます。
共有インターセプターインスタンスにも使用できますが、このようなシナリオではインターセプター参照を直接設定することをお勧めします。
entityInterceptorBeanName
- Bean ファクトリ内のエンティティインターセプターの名前 setBeanFactory(org.springframework.beans.factory.BeanFactory)
, setEntityInterceptor(org.hibernate.Interceptor)
public void setEntityInterceptor(@Nullable Interceptor entityInterceptor)
このようなインターセプターは、SessionFactory レベル、つまり LocalSessionFactoryBean、またはセッションレベル、つまり HibernateTransactionManager で設定できます。
@Nullable public Interceptor getEntityInterceptor() throws IllegalStateExceptionSE, BeansException
null
を返します。必要に応じて、Bean ファクトリを介してエンティティインターセプター Bean 名を解決します。IllegalStateExceptionSE
- Bean 名が指定されているが、Bean ファクトリが設定されていない場合 BeansException
- Bean ファクトリによる Bean 名前解決が失敗した場合 setEntityInterceptor(org.hibernate.Interceptor)
, setEntityInterceptorBeanName(java.lang.String)
, setBeanFactory(org.springframework.beans.factory.BeanFactory)
public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAware
の setBeanFactory
beanFactory
- 所有 BeanFactory(非 null
)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。setEntityInterceptorBeanName(java.lang.String)
public void afterPropertiesSet()
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
public ObjectSE getResourceFactory()
ResourceTransactionManager
このターゲットリソースファクトリは、通常、スレッドごとの TransactionSynchronizationManager
のリソースバインディングのリソースキーとして使用されます。
ResourceTransactionManager
の getResourceFactory
null
)TransactionSynchronizationManager.bindResource(java.lang.Object, java.lang.Object)
, TransactionSynchronizationManager.getResource(java.lang.Object)
protected ObjectSE doGetTransaction()
AbstractPlatformTransactionManager
返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有のものであり、対応するトランザクション状態を変更可能な形式で保持します。このオブジェクトは、他のテンプレートメソッド (doBegin や doCommit など) に直接、または DefaultTransactionStatus インスタンスの一部として渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の getTransaction
呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction
実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。
AbstractPlatformTransactionManager
の doGetTransaction
AbstractPlatformTransactionManager.doBegin(java.lang.Object, org.springframework.transaction.TransactionDefinition)
, AbstractPlatformTransactionManager.doCommit(org.springframework.transaction.support.DefaultTransactionStatus)
, AbstractPlatformTransactionManager.doRollback(org.springframework.transaction.support.DefaultTransactionStatus)
, DefaultTransactionStatus.getTransaction()
protected boolean isExistingTransaction(ObjectSE transaction)
AbstractPlatformTransactionManager
結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は false
を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の isExistingTransaction
transaction
- doGetTransaction によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doGetTransaction()
protected void doBegin(ObjectSE transaction, TransactionDefinition definition)
AbstractPlatformTransactionManager
このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。
特別なシナリオは、セーブポイントのないネストされたトランザクションです: useSavepointForNestedTransaction()
が "false" を返す場合、このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。
AbstractPlatformTransactionManager
の doBegin
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト definition
- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス protected ObjectSE doSuspend(ObjectSE transaction)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doSuspend
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doResume(java.lang.Object, java.lang.Object)
protected void doResume(@Nullable ObjectSE transaction, ObjectSE suspendedResources)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doResume
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト suspendedResources
- doSuspend によって返される、中断されたリソースを保持するオブジェクト AbstractPlatformTransactionManager.doSuspend(java.lang.Object)
protected void doCommit(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。
AbstractPlatformTransactionManager
の doCommit
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doRollback(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。
AbstractPlatformTransactionManager
の doRollback
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doSetRollbackOnly(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の doSetRollbackOnly
status
- トランザクションのステータス表現 protected void doCleanupAfterCompletion(ObjectSE transaction)
AbstractPlatformTransactionManager
doCommit
および doRollback
の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractPlatformTransactionManager
の doCleanupAfterCompletion
transaction
- doGetTransaction
によって返されるトランザクションオブジェクト protected void disconnectOnCompletion(Session session)
デフォルトの実装は、単に Session.disconnect()
を呼び出します。サブクラスは、no-op または微調整された切断ロジックでこれをオーバーライドできます。
session
- 切断する Hibernate セッション Session.disconnect()
protected DataAccessException convertHibernateAccessException(HibernateException ex)
org.springframework.dao
階層からの適切な例外に変換します。指定された SQLExceptionTranslator を Hibernate JDBCException に自動的に適用するか、Hibernate のデフォルトの変換に依存します。
ex
- 発生した HibernateExceptionSessionFactoryUtils.convertHibernateAccessException(org.hibernate.HibernateException)