0

私は現在、spring-webmvc アプリを作成しています。数日前、最初の問題は、Hibernate と Spring でトランザクションを使用する方法がわからないことでした。これですべてが機能し、トランザクションマネージャーが稼働し、トランザクションを正常に処理できるようになりました。

これは私のJavaベースの春の設定の一部です:

@Configuration
@ComponentScan(basePackages = { "de.macomp.maipds" })
@EnableTransactionManagement
public class MainConfigLib {

    ...

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager manager = new HibernateTransactionManager(sessionFactory());
        return manager;
    }
}

したがって、サービス層または dao 層のメソッドをトランザクションで実行したい場合は、@Transactional でアノテーションを付けるだけで問題ありません。私の問題は、トランザクションでサービス メソッドを実行しないようにしたい場合、次のエラーが発生することです。

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

これが発生するコードは次のようになります。

    ...
    @Override
    public Publisher findByName(String name) {
        Session session = this.sessionFactory.getCurrentSession();
        //bam!
        ...

どうにかして環境を「強制」して、「非トランザクション」セッションを提供することはできますか?! DAO の sessionFactory の transactionManager プロパティが null です。

@Transactional を「findByName」に追加すると問題は解決しますが、このメソッドではトランザクションは必要ありません...

何か案は?

4

2 に答える 2

2

トランザクションが必要です。このメソッドを次のようにマークできますread-only

@Transactional(readOnly = true)
public Publisher findByName(String name) {
   ...
}

春のドキュメントから:

読み取り専用ステータス: 読み取り専用トランザクションはデータを変更しません。読み取り専用トランザクションは、場合によっては最適化に役立ちます (Hibernate を使用する場合など)。

JBossウィキより

多くのアプリケーション開発者は、トランザクションの外でデータベースと通信できると考えています。これは明らかに不可能です。データベース トランザクション以外のデータベースに SQL ステートメントを送信することはできません。非トランザクション データ アクセスという用語は、明示的なトランザクション境界やシステム トランザクションがないこと、およびデータ アクセスの動作が自動コミット モードの動作であることを意味します。これは、物理的なデータベース トランザクションが関与していないという意味ではありません。

もっと:

于 2013-11-14T13:26:51.853 に答える