Spring Transaction Managementについて話す前に、Springを使用しないときにHibernateでデータ操作をどのように実行するかを考えてみましょう。 Hibernateでは、最初にトランザクションを開始し、次にデータ操作を実行し、トランザクションを送信し、トランザクションを閉じる必要があります。これを行う理由は、Hibernateのデフォルトのトランザクション自動コミットが偽であるため、トランザクションを手動で送信する必要があるためです。毎回トランザクションを手動で送信したくない場合は、ファイルhibernate.cfg.xmlでトランザクションを自動的にコミットするように設定できます。
XMLコード
<プロパティ名= "defaultAutoCommit"> <bale> false </value> </property>
トランザクションコミット方法を自動に設定しても、データ操作を実行できます。これは実際のビジネスニーズを満たしていません。1つのデータを保存した後、別のデータを保存し続けることができることを願っています。 2つ以上のデータを保存した後、トランザクションを一緒にコミットしたいと考えています。このようにして、エラーがある場合でも、データの一貫性をロールバックして固定できます。成功または失敗のいずれか。現時点では、1つのデータを保存した後にトランザクションを自動的にコミットすることはできません。これらは同じトランザクションにないため、データの一貫性を保証することはできません。したがって、現時点では、HibernateにSpringが提供するトランザクション管理メカニズムを使用する必要があるトランザクションを手動で構成する必要があります。 Springが提供するトランザクション管理は、プログラマティックで宣言的な2つのカテゴリに分類できます。プログラミングは実際にコードで制御されています。 Hibernateがデータを操作するのと同じように、トランザクションを開始し、トランザクションを提出します。この方法には特定の制限があるため、通常、宣言型を使用してトランザクションを構成します。
宣言的なトランザクション構成は、主に次の手順に分割されます。
1。宣言トランザクション構成
(1)トランザクションマネージャーを構成します。
(2)トランザクションの伝播特性。
(3)これらのクラスと方法はトランザクションを使用します。
<! - トランザクションマネージャーがその機能を指定し、処理のためにトランザクションをSpringに引き渡すセッションファクトリを構成します - > <bean id = "transactionmanager"> <プロパティ名= "sessionfactory"> <ref bean = "sessionfactory"/> </compropert> </bean> < Transaction-Manager = "TransactionManager"> <tx:attributes> <tx:method name = "save*" propagation = "required"/> <tx:method name = "delete*" propagation = "required"/> <tx:method name = "updation*" propagation = "" reby "/> <tx = <the" read "" read = "" pric <tx:method name = "*" read-only = "true"/>> </tx:属性> </tx:アドバイス> <! - これらのクラスのどのメソッドがトランザクションに参加するか - > <aop:config> <aop:aop:aop:a alservicemethod "expression =" execution(*com.coe.service。 pointcut-ref = "allservicemethod" advice-ref = "txadvice"/> </aop:config>
トランザクションを構成するときは、通常、トランザクションの境界をサービスレイヤー、つまりビジネスロジックレイヤーに設定します。これは、ビジネスロジックレイヤーでデータ操作の列の一部を完了することが多いためです。 DAOデータレイヤーに配置すると、粒度が小さすぎます。さらに、ビジネスロジックレイヤーでトランザクションを構成する場合、実際に操作するときに将来見られる二次キャッシュにも有益です。
2。ビジネスロジックメソッドを作成します
この時点で、HibernateTemplateで提供されるデータ操作方法を使用して、ビジネスロジックレイヤーにビジネスロジックメソッドを記述できます。もちろん、私たちのメソッドは、保存、削除、更新、およびメソッドの開始として取得して、トランザクション構成で構成されたものと同じでなければなりません。デフォルトでは、ランタイムの例外はロールバック(RuntimeExceptionサブクラスを継承することを含む)のみロールバックし、通常の例外はロールされないことに注意してください。
最後に、トランザクションのいくつかの伝播特性を要約しましょう。
1。Propagation_required:トランザクションが存在する場合、現在のトランザクションがサポートされています。トランザクションがない場合、有効になります。
2。Propagation_Supports:トランザクションが存在する場合、現在のトランザクションがサポートされています。トランザクションがない場合、非移植の実行。
3。Propagation_Mandatory:トランザクションが既に存在する場合、現在のトランザクションがサポートされています。アクティブなトランザクションがない場合、例外がスローされます。
4。propagation_requires_new:常に新しいトランザクションを開きます。トランザクションが既に存在する場合、既存のトランザクションは停止されます。
5。POPAGATION_NOT_SUPPORTED:常に非貿易を実行し、既存のトランザクションを一時停止します。
6。propagation_never:アクティブなトランザクションが存在する場合は、常に非貿易を実行します。例外がスローされます。
7。propagation_nested:アクティブなトランザクションが存在する場合、ネストされたトランザクションで実行されます。アクティブなトランザクションがない場合は、transactionDefinition.propagation_requiredプロパティに従って実行します。
この記事を通して、SpringとHibernateの統合トランザクション管理を理解するのに役立つことを願っています。このウェブサイトへのご支援ありがとうございます!