Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa EJB—MDB中的提交和刷新_Jpa_Glassfish_Ejb_Eclipselink - Fatal编程技术网

Jpa EJB—MDB中的提交和刷新

Jpa EJB—MDB中的提交和刷新,jpa,glassfish,ejb,eclipselink,Jpa,Glassfish,Ejb,Eclipselink,我有一个消息驱动bean,它通过EntityManager与数据库通信。EM是通过@PersistenceContext注入的,就像正常情况一样。我希望立即刷新对实体的更改,而不必等待MDB完全完成对给定消息的处理 例如: MDB's onMessage() { Foo f = em.find(Foo.class, 123); f.setNewStatus("Performing work!"); em.merge(f); em.flush(); ... // Conti

我有一个消息驱动bean,它通过EntityManager与数据库通信。EM是通过@PersistenceContext注入的,就像正常情况一样。我希望立即刷新对实体的更改,而不必等待MDB完全完成对给定消息的处理

例如:

MDB's onMessage() {
  Foo f = em.find(Foo.class, 123);
  f.setNewStatus("Performing work!");
  em.merge(f);
  em.flush();
  ...
  // Continue doing a lot of work...
  ...

  f.setNewStatus("Done!");
  em.merge(f);
  em.flush();
}
问题是我从来没有看到过表演的作品!来自MDB上下文之外的状态,例如直接登录到DB并检查元组的值

这似乎与交易有关。从在线材料中,听起来事务是在onMessage上下文中启动的,直到方法完成才提交。因此,中间状态永远不会被提交,因为我们最终写入了Done!它将覆盖PersistentContext中的Foo值


这类问题有解决办法吗?控制事务上下文的某种方法?

我认为您想要实现的是在事务提交之前查看事务外部的更改。这只有在事务隔离设置为readuncommitted时才可能,我不认为这是数据库中的默认设置

您可以做的是添加方法,该方法将记录您的数据,属性为:@transactionattributetractionattributeType.REQUIRES\u NEW


在这种情况下,容器将不得不暂停当前事务,创建一个将在此方法中执行的新事务,当它完成时,主事务将恢复。

@Scarpul-感谢您的响应。我也遇到了这个特性,并开始实现它。然而,为了一个更普遍的问题,我没有在上面列出一个警告。实际上,我将EntityManager交给了一个单独的业务逻辑专用类来完成实际工作,而不是在MDB中耦合所有业务逻辑。我在这个POJO类中使用\@TransactionAttribute时遇到了一些问题-我将进一步调查,在最坏的情况下,我可能不得不将我的POJO类转换为无状态EJB。我将很快报告结果。您创建了EJB吗?它是在执行将处理事务的EJB调用时围绕该方法编制的代码。另外,从EJB中直接调用该方法是没有用的,因为不确定您是如何构造代码的。你应该在网上找到很多关于这方面的例子。你的第二点是我遇到的问题。我试图从同一个EJB调用特定的方法。