java - 没有 EntityManager 绑定(bind)到这个线程 JPA

标签 java hibernate jpa playframework playframework-2.0

我有一个 POJO(在这个例子中是 Myclass),我在我的应用程序中保留/更新/删除它。

我使用监听器类检测对该对象的更改,然后在监听器类中将更改保存到另一个表。

Here is my class (dummy example) :

EntityListeners({MyListener.class})
class MyClass {
  String name;
  String surname;

  /*...getters...setter..etc */

  public void save() {
    JPA.em().persist(this);
    return this;
  }

  public void update() {
    JPA.em().merge(this);
  }
}

class MyListener {
   @preUpdate
   public void preUpdate() {
    /*...some logic to save the changes irrelevant*/
    someAuditObj.createWithData(.......);
    someAuditObj.save();
   }
}

我正在使用 play framework v2.1.3 构建我的网络应用程序,所有这一切都运行良好,我真的很高兴它的工作方式。

今天我更新了 play framework 到更新版本 v2.2.1。 出于某种原因,当 MyClass 的实例发生更改并且监听器获取更改并尝试保存更改时,事务失败,我在日志中找到了这一点:

Caused by: java.lang.RuntimeException: No EntityManager bound to this thread

所以我花了一段时间才弄清楚由于某种原因事务没有传播到监听器,然后我尝试了一些方法来修复它(监听器类):

@preUpdate
       public void preUpdate() {
        /*...some logic to save the changes irrelevant*/
       JPA.withTransaction(new F.Callback0() {
             @Override
             public void invoke() throws Throwable {
                      someAuditObj.createWithData(.......);
                      someAuditObj.save();
       });
       }

所以这修复了它,它像以前一样正常工作。

我的问题是:

  1. 为什么以前不用手动干预早期版本的 play 框架的事务就可以工作
  2. 有没有更好的方法可以更优雅地实现同样的目标(我不确定这个词是否合适)?

更新

这是我的 Controller 方法:

@Transactional
    public Result updateName(Long id, String name){
        MyClass c = MyClass.findById(id);
        c.setName(name);
        c.update();

        return ok();
    }

所以事务应该传播到所有方法,对吗?但为什么不也听听呢?

我的估计是这样的:

如果一个方法有@Transactional 注解那么所有在里面发生的调用都应该在一个事务中?

最佳答案

看来你遇到了和我一样的问题。看我的问题:https://github.com/playframework/playframework/issues/2042 相同的 JPA 代码适用于 2.1.0 但不适用于 2.2.1 所以我认为这是一个错误。

  1. Why did it work before without meddling manually with transactions with earlier version of play framework
  2. Is there a better way of achieving the same thing more elegantly (I'm not sure that is the right word for it)?

我们只能等到这个问题解决,或者等待 play2 开发人员在这个问题上解释一下如何使用线程和 JPA 事务。目前问题是开放的。

关于java - 没有 EntityManager 绑定(bind)到这个线程 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19931811/

相关文章:

java - 从文本文件在java中创建字符串

java - 为包含 boolean 字段的持久实体覆盖 hashCode() 的正确方法?

java - 如何显示其他用户的通知?

java - Spring 4 与 Hibernate 3 配置

eclipse - hibernate 和 Eclipse 错误

java - JPA,无法删除记录

java - JPA 查询在 tomcat 中的每次循环迭代中变慢

java - 使用 KSTREAM 或 KSQL 将 JSON 数组转换为 JSON 对象

java - 与 data-envers 的连接已关闭

hibernate - 使用 DiscriminatorOptions 和 orphanremoval 继承实体的 JPA OneToMany