1

JPA経由でデータベースを操作するBeanを作成しようとしています。メソッドはすべて @Transactional(readOnly = false) で正しく注釈されています。これまでは、これはサーブレットからの呼び出しによって処理され、すべてうまく機能していました。

ここで、init メソッドでデータベース操作を行いたいと思います。

@Component
public class MyBean {

    @PostConstruct
    @Transactional(readOnly = false)
    public void init() {
        MyEntity myEntity = ...;
        ...
        em.persist(myEntity);
    }

(ケースは簡略化しています)。このように、「セッションがないか、セッションが閉じられていません」という例外が発生します。明らかに、トランザクションは実際の Bean からではなく、サーブレットのリクエストによって実行された場合にのみ正しく開始されます。Bean 自体から実行しても、どうすればこれを達成できますか?

ありがとう。

4

1 に答える 1

4

ちなみに、SpringはBeanの周りのトランザクションプロキシを使用してPostConstructメソッドを呼び出しません(ところで、ほとんどの場合、Beanの外部インターフェイスの一部ではありません)。

別のBean(MyBeanが注入されている場所)から、またはからでもinit()メソッドを呼び出してみてください。MyBeanServletContextListener

于 2012-06-10T13:34:21.367 に答える