Play框架PathBindable与JPA Transactionnal上下文不兼容?

时间:2015-06-02 15:08:04

标签: jpa playframework-2.0

我正在尝试为我的customEntity实现一个简单的PathBindable接口,我正在使用JPA,当我尝试加载可绑定的url时,我得到了这个JPA错误:

[info] application - onBadRequest: POST /path/customEntity/2554003 - No EntityManager bound to this thread. Try to annotate your action method with @play.db.jpa.Transactional

当然,绑定到此路由的操作方法使用@Transaction进行注释。 我也尝试直接在customEntity.bind方法上添加注释,但是我得到了同样的错误。

我的实体代码示例:

public class MyEntity implements Serializable, PathBindable<MyEntity> {
  @Override @play.db.jpa.Transactional
  public MyEntity bind(String key, String value) {
    return findById(Long.valueOf(value));
  }

  @Override
  public String unbind(String s) {
    return String.valueOf(id);
  }

  @Override
  public String javascriptUnbind() {
    return String.valueOf(id);
  }
}

我的控制器示例:

@Transactional
public class MyController extends Controller {
    public static Result read(final MyEntity ent) {
      return ok(ent.getName());
    }
}

我的路线档案样本:

POST /myEntity/:ent  controllers.MyController.read(ent : MyEntity)

编辑:

就像@Mon Calamari所建议的那样,我尝试过使用JPA.withTransaction语法并且它部分工作,它引发了我关系数据加载的另一个问题,看起来我之后无法从模型中获取任何关系数据使用withTransaction方法获取模型。

Execution exception[[LazyInitializationException: failed to lazily initialize a collection of role: models.Entity.mappedChilds, could not initialize proxy - no Session]]

某种JPA限制?这是否意味着JPA和PathBindable的播放功能不兼容?

1 个答案:

答案 0 :(得分:1)

@play.db.jpa.Transactional注释仅适用于控制器方法。尝试将findById(Long.valueOf(value))打包到JPA.withTransaction