我正在尝试为我的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的播放功能不兼容?
答案 0 :(得分:1)
@play.db.jpa.Transactional
注释仅适用于控制器方法。尝试将findById(Long.valueOf(value))
打包到JPA.withTransaction