Sim*_*eon 8 java hibernate jpa transactions ejb-3.0
这可能是微不足道的,但我会喜欢一些帮助.
我明白了:
javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager
11:54:37,105 ERROR [STDERR] at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77)
11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
Run Code Online (Sandbox Code Playgroud)
做的时候:
@PersistenceContext(unitName = "someName")
private EntityManager em;
...
final EntityManager entityManager = getEntityManager();
final EntityTransaction tx = entityManager.getTransaction(); // here
Run Code Online (Sandbox Code Playgroud)
谁能告诉我原因可能是什么?
Vin*_*lds 19
在Java EE托管上下文中获取与EntityManager关联的EntityTransaction实例的引用是非法的.从EntityManager.getTransaction()的Java EE API文档中:
返回资源级EntityTransaction对象.可以串行使用EntityTransaction实例来开始和提交多个事务.
Run Code Online (Sandbox Code Playgroud)Returns: EntityTransaction instance Throws: IllegalStateException - if invoked on a JTA entity manager
最后一行与此相关.
使用@PersistenceContext或@Inject注释将EntityManager注入部署在应用程序服务器上的EJB时,EntityManager将由容器管理,而不是由应用程序管理.容器管理实体管理器必须是JTA实体管理器; 应用程序管理的实体管理器可以是资源本地实体管理器.这由JPA规范决定:
通过JTA控制其基础事务的实体管理器称为JTA实体管理器.
其底层事务由应用程序通过EntityTransaction API控制的实体管理器称为资源本地实体管理器.
容器管理的实体管理器必须是JTA实体管理器.JTA实体管理器仅指定用于Java EE容器.
从第一点推断(关于IllegalStateException),您不得获取容器注入的EntityManagers的EntityTransaction引用.但是,如果容器只注入了EntityManagerFactory,并且您的应用程序通过调用获得了EntityManager引用,则可以这样做EntityManagerFactory.getEntityManager.
此外,应该注意的EntityManager.getTransaction()是,对于JTA实体管理器而言,调用是没有意义的.这在JPA规范中表示,在EntityTransaction接口的定义中:
EntityTransaction接口用于控制资源本地实体管理器上的资源事务.
关于管理JTA事务本身的主题,如果您需要自己管理事务边界(即使用bean管理的事务),请注入UserTransaction实例.或者,如果您希望容器管理事务,那么只需使用适当的TransactionalAttribute值注释方法或bean .
在应用程序服务器中使用资源本地实体管理器(和数据源)与bean托管或容器管理事务通常不是一个好主意,但是可以这样做.
您将找到一个合适的示例,演示如何在Hibernate EntityManager文档中注入EntityManager来使用BMT .如果您已经注释了bean类或方法,那么CMT就更加微不足道了; 你只需要避免调用getEntityTransaction()CMT 的方法来工作.
如果您希望进一步了解,我建议您阅读JPA 2.0规范的第7章,标题为"实体管理器和持久性上下文".本章提供的示例说明:
| 归档时间: |
|
| 查看次数: |
14458 次 |
| 最近记录: |