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() 指定されたすべての Bean プロパティを設定した(そして BeanFactoryAware と ApplicationContextAware を満たした)後に BeanFactory によって呼び出されます。 |
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 boolean | isPhysicallyConnected(Session session) 指定されたセッションが(まだ)データベースに物理的に接続されているかどうか、つまり、内部でアクティブな JDBC 接続を保持しているかどうかを判断します。 |
protected boolean | isSameConnectionForEntireSession(Session session) 指定された Hibernate セッションが常に同じ JDBC 接続を保持するかどうかを返します。 |
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 を設定します。 |
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, useSavepointForNestedTransactioncloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEcommit, getTransaction, rollbackpublic 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 を抽出するためにラップ解除されます。
@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 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このメソッドにより、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)
AbstractPlatformTransactionManagerdoCommit および doRollback の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractPlatformTransactionManager の doCleanupAfterCompletion transaction - doGetTransaction によって返されたトランザクションオブジェクト protected void disconnectOnCompletion(Session session)
デフォルトの実装は、単に Session.disconnect() を呼び出します。サブクラスは、no-op または微調整された切断ロジックでこれをオーバーライドできます。
session - 切断する Hibernate セッション Session.disconnect()protected boolean isSameConnectionForEntireSession(Session session)
デフォルトの実装では、セッションの接続解放モードが "on_close" になっていることを確認します。
session - 確認する Hibernate セッション ConnectionReleaseMode.ON_CLOSEprotected boolean isPhysicallyConnected(Session session)
session - 確認する Hibernate セッション isSameConnectionForEntireSession(Session)protected DataAccessException convertHibernateAccessException(HibernateException ex)
org.springframework.dao 階層からの適切な例外に変換します。指定された SQLExceptionTranslator を Hibernate JDBCException に自動的に適用するか、Hibernate のデフォルトの変換に依存します。
ex - 発生した HibernateExceptionSessionFactoryUtils.convertHibernateAccessException(org.hibernate.HibernateException)