0

私は小さな個人的なプロジェクトで Hibernate と Spring を使用しています。さて、この分野ではまだ初心者なので、取引に関するいくつかの基本的な質問をしたいと思います。

  • トランザクション マネージャーを宣言し、DAO クラスに @Transactional(propagation = Propagation.REQUIRED, readOnly = false) として注釈を付ける必要があるようです。そうしないと、奇妙な例外が発生するか、エンティティがデータベースに保存されません。実際にトランザクションを使用する必要はありますか? それらを使用せずにデータベースにデータを保存することはできませんか (MySQL ISAM テーブルはトランザクションをサポートしていないと思いました)、どのように使用しますか?

  • @Transactional 属性を配置するのに最適な場所はどこですか? 現在、私のジェネリック HibernateDAO スーパークラスで宣言されており、おそらく最も深いレベルです。そういうところはあまり向いていないと思います。しかし、それを上に移動すると、Spring MVC コントローラーに配置することになり、これは間違いなく不適切な場所でもあります。これまでのところ、他のサービス層はありません。データベースから単語と定義を保存して提供すること以外は何もしていないからです。

どうもありがとう

4

3 に答える 3

1

はい、Hibernateを使用してデータベースにアクセスするには常にトランザクションを使用する必要があります(実際には使用しなくても)。あなたが言ったように、それはトランザクションDBエンジンではないので、私はMyISAMを使用しません。

アノテーションを配置するのに最適な場所@Transactionalは、サービスレイヤーの機能サービスです。実際のサービスレイヤーを導入するか、DAOレイヤーが実際にはサービスレイヤーであると考えます。ただし、コントローラーがFooDAOを使用してfooを保存し、BarDAOを使用してbarを保存する必要があり、これら2つの挿入をトランザクションで実行する必要がある場合は、大きな問題が発生することに注意してください。そのため、サービスレイヤーは非常に重要です。1つのトランザクションで複数のDAOにアクセスできます。

于 2012-10-21T12:03:04.990 に答える
1

実際にトランザクションを使用する必要がありますか?

はい、そうです。リレーショナルデータベースの基本的な機能の1つは、トランザクションです。ただし@Transactional、デフォルトのパラメータを使用した単純なもので十分です。ただし、AOPを使用して、クラスのセット全体を囲むXMLでトランザクションを宣言できます。たとえば、すべてに*DAO名前があります。

@Transactional属性を設定するのに最適な場所はどこですか?

サービスレイヤー、参照:DAO、サービスレイヤーアーキテクチャでHibernateでSpringMVCを使用する正しい方法は何ですか

于 2012-10-21T12:03:39.387 に答える
0

Spring Hibernateトランザクションマネージャーは、Hibernateセッションの管理も行います。sessionFactory.getCurrentSession()APIをSpring hiberanteTranasactionManagerと一緒に使用すると、Springはトランザクションの開始時にセッションを開き、トランザクションの終了後にセッションを閉じます。

これにより、コードがよりクリーンになります。openSessionとcloseSessionでコードを散らかす必要はありません。また、休止状態の操作ごとにセッションを開いたり閉じたりするのではなく、リクエストごとのセッションアプローチを使用することをお勧めします。

おっしゃるように、これを配置する適切な場所はサービスレイヤーです。これは、いくつかのDAOメソッドを呼び出すことによってユースケースのロジックを実装するクラスです。持っていない場合は、コントローラーから複数のDAO呼び出しを実行しているか、必要に応じてDAOが複数のデータベース操作を実行しています。

コントローラメソッドから複数のDAOメソッドを呼び出す場合は、コントローラメソッドに@Transactionalを配置する必要があります。

DAOが複数のDB操作を行っている場合は、DAOレベルで配置する必要があります。

アプリケーションに重要なロジックが含まれている場合(基本的なCRUDを超えて)、このレベルでサービスレイヤーとマネージャートランザクションを作成することをお勧めします。

于 2012-10-21T12:04:35.220 に答える