我有一个 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
,所有这些都运行良好,我真的很高兴它的工作方式。
今天我将播放框架更新为更新版本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();
});
}
所以这修复了它,它像以前一样工作,没有问题。
我的问题是:
- 为什么它以前没有手动干预早期版本的游戏框架的事务就可以工作
- 有没有更好的方法来更优雅地实现同样的事情(我不确定这是正确的词)?
更新
这是我的控制器方法:
@Transactional
public Result updateName(Long id, String name){
MyClass c = MyClass.findById(id);
c.setName(name);
c.update();
return ok();
}
所以事务应该传播到所有方法,对吗?但为什么不去倾听呢?
我的估计是这样的:
如果一个方法有@Transactional 注释,那么内部发生的所有调用都应该在一个事务中?