`
bawking
  • 浏览: 33622 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ejb3:Illegal to call this method from injected, managed EntityManager

阅读更多
在EJB3.0的业务方法中,我们可以一般都猜想,可以调用EntityManager的getTransaction()方法得到一个事务对象,然后再通过该事务的begin()、commit()方法,可以开启、提交事务,然后关闭连接。然而,在开发过程中却发现这样做会抛出异常:java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager。

在Hibernate中,我们明明可以手动开启、提交事务的,为什么在EJB3.0中却不行呢?上网找了一下,终于发现了问题的所在。

原来,我们在使用EntityManager的时候,是通过注解@PersistenceContext注入到EJB容器中,并由这个容器管理我们的事务,而且必须对指定的业务方法添加@Local或@Remote注释才能正常工作,所以我们根本就不用手动控制事务。但往往我们需要在一个业务方法中对数据库多次访问,这会涉及到事务的传播行为,如果不手动控制,我们又如何让不同的数据库操作设定到指定的事务中呢?

不怕,EJB3.0还是帮我们做了很多事情的。我们很容易想起Spring对Hibernate的事务管理,而事实上EJB容器也具备这样的功能,我们可以在相应的业务方法前添加形如@TransactionAttribute(TransactionAttributeType.REQUIRED)的注解(具体含义就不再多讲了),给该方法中的数据库操作指定事务传播行为,这样我们就无需手动开启、提交事务、关闭连接了,而程序也就不会再抛java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager异常了。

转自:
    http://hi.baidu.com/waltertan/blog/item/045249739b66e5108601b01a.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics