Ebean 2.7.3 / Play Framework 2.0.4 - 使用@Embedded时的OptimisticLockException / NullPointerException

时间:2012-10-14 10:57:25

标签: playframework-2.0 ebean

我在Play Framework 2.0.4中集成了Ebean 2.7.3的问题。

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

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

Caused by: java.lang.NullPointerException: null
com.avaje.ebeaninternal.server.core.PersistRequestBean.hasChanged(PersistRequestBean.java:728)

所以我的问题是..在模型中使用@Embedded属性是否有正确的方法?我知道在以前的Ebean版本中已经讨论过这个问题,但似乎没有可用的解决方案。

嗯..实际上我发现了一种方法如何做到这一点。当我从db加载一个对象并且我保持这个类实例时,我能够更改其属性并调用update()而不会出现问题。但实际上这不是我的解决方案,因为播放框架是无状态的,所以我无法在会话期间保留原始对象。我必须创建一个新的,用值填充并保存它。如果没有@Embedded,这可以正常工作。

有关如何解决问题的任何线索?

0 个答案:

没有答案