【发布时间】:2014-09-07 11:18:46
【问题描述】:
我想使用过滤器将所有请求记录到我的 Web 服务器。
起初我尝试了我在 EJB 和 Web 服务类中使用的常规方式。一旦我尝试坚持,我的程序就会失败。我可以查询(此处未显示):
@PersistenceContext(unitName = "ConsoleManagement")
protected EntityManager em;
...
private void someMethod(){
Request userRequest = new Request();
userRequest.setApikey(apikey);
userRequest.setFormat(requestedFormat);
userRequest.setMethod(method);
userRequest.setRequestIp(ip);
userRequest.setRequestUrl(requestUrl);
em.persist(userRequest); // fails here
em.flush();
}
错误:
[ERROR ] SRVE0315E: An exception occurred: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: javax.persistence.TransactionRequiredException: No active transaction for PuId=WebApi#WebApi.war#PersistenceUnitName
at com.ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:250)
据此我收集到(尽管找不到任何文档)过滤器不是容器管理的。
然后我尝试了以下两个:
@PersistenceContext(unitName = "ConsoleManagement")
protected EntityManager em;
...
private void someMethod(){
Request userRequest = new Request();
userRequest.setApikey(apikey);
userRequest.setFormat(requestedFormat);
userRequest.setMethod(method);
userRequest.setRequestIp(ip);
userRequest.setRequestUrl(requestUrl);
em.getTransaction().begin(); // fails here
em.persist(userRequest);
em.flush();
em.getTransaction().commit()
}
@PersistenceUnit(unitName = "ConsoleManagement")
EntityManagerFactory emf;
public void someMethod() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin(); // fails here
em.persist(userRequest);
em.flush();
em.getTransaction().commit();
em.close();
}
两种情况都出错:
[ERROR ] SRVE0315E: An exception occurred: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: java.lang.IllegalStateException:
Exception Description: Cannot use an EntityTransaction while using JTA.
[编辑] 如果我通过 @PersistenceUnit 注入 EntityManagerFactory 并删除 em.getTransaction().begin(),我会得到一个不同的错误。
@PersistenceUnit(unitName = "ConsoleManagement")
EntityManagerFactory emf;
public void someMethod() {
EntityManager em = emf.createEntityManager();
//em.getTransaction().begin();
em.persist(userRequest);
em.flush(); // fails here now
//em.getTransaction().commit();
em.close();
}
错误:
[ERROR ] SRVE0315E: An exception occurred: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: javax.persistence.TransactionRequiredException:
Exception Description: No externally managed transaction is currently active for this thread
我现在有点卡住了。
[编辑] 持久化单元:
<persistence-unit name="ConsoleManagement">
<description>This unit manages user data including user information, user projects, and project api keys</description>
<jta-data-source>jdbc/db2dbcpdb/develop</jta-data-source>
<class>com.utoronto.websphere.jaxrs.entities.Project</class>
<class>com.utoronto.websphere.jaxrs.entities.User</class>
<class>com.utoronto.websphere.jaxrs.entities.Api</class>
<class>com.utoronto.websphere.jaxrs.entities.Apikey</class>
<class>com.utoronto.websphere.jaxrs.entities.Version</class>
<class>com.utoronto.websphere.jaxrs.entities.Request</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit>
【问题讨论】:
-
ConsoleManagement 是带有
transaction-type="JTA"的持久性单元吗? -
jdbc/db2dbcpdb/develop 已设置。这样会自动吗?
标签: jakarta-ee jpa jta