【发布时间】:2015-05-22 20:20:40
【问题描述】:
感觉很简单:
我有一个ViewScoped bean(JPA2 + EE6 + Seam3,如果这很重要),Web 应用程序的用户可以在其中调用这样的方法:
public void save() {
doEntityManagerStuff(); // manipulates data in the database
callRemoteWebservice(); // which is to read said data and propagate it to other systems
}
不幸的是,save() 在左大括号处开始了一个事务,在右括号之前没有提交它,这意味着远程 Web 服务无法读取新数据。
我已尝试显式提取和注释数据库工作:
@TransactionAttribute(REQUIRES_NEW)
private void doEntityManagerStuff() {
blabla(); // database stuff
}
但这根本没有任何影响。 (也许是因为那是 EJB 的东西,而我在接缝中运行......?)
到目前为止,唯一对我有用的是注入 @UserTransaction 并在 save() 或 doEntityManagerStuff() 的末尾强制提交事务,但这感觉非常肮脏和危险。
另一种选择是关闭整个项目的容器管理事务,但这意味着我必须让我的 所有 bean 手动管理它们的事务,只是 em> 这样我就可以解决这个问题了。
有没有更好的办法?
【问题讨论】:
-
等等,您的 JSF 托管 bean 是事务性的..?这不是默认行为。你们的 JSF 支持 bean 类都有哪些注释?您应该基本上将事务方法分离到一个真正的服务类中,然后将其注入到您的 JSF 托管 bean 中。
-
仅限
javax.faces.bean.ViewScoped。 -
@BalusC - 显然,everything 我的网络应用确实打开了一个事务。我打开了
com.arjuna.ats.jta的跟踪日志记录,我得到了一些事务,比如从服务器请求一个静态PNG,甚至只在一个既不接触EntityManager 也不接触数据库的bean 中运行@Schedule(...)方法。有些东西配置错误,这似乎很清楚。我什至从哪里开始寻找? -
“我什至从哪里开始寻找?” 您的 web.xml 中的 servletfilters?
-
@Kukeltje - 谢谢,我也是这么想的,确实有两三个。但是它们都没有任何事务性内容或注释。 不过,我找到了罪魁祸首。 我们的项目是一个奇怪的混蛋,它使用 EE6 和 Seam 来获取
@ViewScopedbean。作为 Seam 的一部分,org.jboss.seam.transaction中的依赖关系seam-transaction。一旦进入,每个呼叫都会触发BaseTransaction.begin。我看看能不能摆脱它。
标签: jpa jsf-2 transactions jta