Playframework 2.0 Ebean 2.7.3/Play Framework 2.0.4-使用@Embedded时出现OptimisticLockException/NullPointerException

Playframework 2.0 Ebean 2.7.3/Play Framework 2.0.4-使用@Embedded时出现OptimisticLockException/NullPointerException,playframework-2.0,ebean,Playframework 2.0,Ebean,我对集成在Play Framework 2.0.4中的Ebean 2.7.3有一个问题 让我先解释一下它在框架中是如何工作的。当我想要创建一个新对象时,我调用一个函数,它创建模型对象的新实例并将其发送到web表单。提交表单后,将调用save()函数。此函数用于绑定表单中的值,并将其分配给模型对象的另一个新实例。然后对对象调用update()函数,并将所有内容正确写入数据库。当我想更新一个对象时,方法几乎是一样的,只是有一些小的不同。在开始时,对象从数据库加载,发送到表单,然后解析回来。区别在于,

我对集成在Play Framework 2.0.4中的Ebean 2.7.3有一个问题

让我先解释一下它在框架中是如何工作的。当我想要创建一个新对象时,我调用一个函数,它创建模型对象的新实例并将其发送到web表单。提交表单后,将调用save()函数。此函数用于绑定表单中的值,并将其分配给模型对象的另一个新实例。然后对对象调用update()函数,并将所有内容正确写入数据库。当我想更新一个对象时,方法几乎是一样的,只是有一些小的不同。在开始时,对象从数据库加载,发送到表单,然后解析回来。区别在于,我还在解析更新对象的原始主键。然后,当我调用update()函数时,所有内容都被正确写入,因为ebean知道主id,因此可以更新正确的对象

当我向模型添加
@Embedded
属性时,问题就开始了。我可以创建新对象,保存它,读取它,但我不能更新它。当我尝试使用我描述的相同原理更新对象时,我遇到了OptimisticLockException。当我检查SQL日志时,我发现Ebean正在使用SQL集合部分中的所有模型属性以及WHERE子句中的所有属性进行更新。我知道这与Ebean文档中描述的乐观锁定机制有关。问题是Ebean在两个部分(SET和WHERE)中使用相同的值。Ebean似乎无法查找原始实体,因此无法使用WHERE部分中的旧值。因此,数据库中的共同响应实体永远找不到,也永远不会更新并返回异常。我也知道这个问题通常通过
@Version
注释来解决。因此,我创建了名为updatedStamp的新属性,并用
@Version
对其进行了注释。使用这个原则,我在调用update()时遇到了NullPointerException

所以我的问题是。。在模型中是否有适当的方法使用
@嵌入的
属性?我知道在以前版本的Ebean中已经讨论过这一点,但似乎没有可用的解决方案

嗯。。事实上我找到了一种方法。当我从db加载一个对象并保留这个类实例时,我能够毫无问题地更改它的属性并调用update()。但实际上这对我来说不是一个解决方案,因为play框架是无状态的,所以我无法在会话期间保留原始对象。我必须创建一个新的,用值填充并保存它。如果没有@Embedded,这一切正常


关于如何解决这个问题有任何线索吗?

在这里,您将找到问题的解决方案:[[1]:不幸的是,它不起作用。无论如何,我找到了适合我的解决方案。在调用
update()之前,我刚刚在模型类上添加了对函数
\u ebean\u setEmbeddedLoaded()
的调用
。现在一切都完美无瑕。你救了我一天!你从哪里找到了解决方案?如果仍然存在此问题,请创建一个测试用例并打开github问题。谢谢。
Caused by: java.lang.NullPointerException: null
com.avaje.ebeaninternal.server.core.PersistRequestBean.hasChanged(PersistRequestBean.java:728)