我有一个Play应用(使用ebean播放v2.3.4-),即将投入使用。这些天的测试中,我看到了一些非常奇怪的东西!有时,用于将模型持久存储在数据库中的update()方法不起作用(没有任何异常)。我正在寻找问题,直到现在我已经牢记这三个:
update()
,而不是update(id)
,也许是问题所在?null
,因此稍后我将更改为私有字段+ getter / setter。但是现在,这可能是问题吗?update()
不能在所有对象上正常工作,我就做了activator clean
,然后一切顺利。 (另一次这种清理无济于事)例如,在我的代码中,我在一些对象上循环,在我的循环内,我更改了每个对象的属性,并为该对象调用update()
。对于其中的一些,更改会持续存在,对于某些则不会!!! (这种和平的代码通过我的app/Global.java
中的AKKA调度程序定期执行)
for (User respPerson : event.setup.respPersons) {
respPerson.addNotification(notification);
respPerson.update();
}
更新:从update()
更改为update(id)
不能解决问题。这是2个User
实例的调试器的图片。右边的一个总是成功更新,左边的不成功...
UPDATE2有关上述示例的更多信息:内部循环中,我向用户实例添加了一个通知(用户持有通知的List
)。现在,如果我用调试器检查User
实例,它的通知列表中将有一个新的Notification
实例。所以一切都应该很好...然后我打电话给update()
,并希望所做的更改应保留在DB中。但是在update
之后,当我使用静态调用并从数据库中获得具有相同User
的id
时,它不包含我之前添加的通知!
这总是发生在Object的特定实例上(在上图中,ID为33的用户)。我试图在另一个Notification
的这个User
实例中添加一个controller
,但它仍然存在。但是每次我使用计划任务在Global.java
内部执行此操作时,它都不会持久化。
更新!问题已找到并解决。我将在接下来的几个小时内更新此问题。
也许您会混合使用公共属性和获取者/设置者?如果您未在模型中创建任何getter \ setter,则Ebean(Play)会自动生成getter \ setter,否则您需要创建所有它们。您可以关闭此功能,但默认情况下它处于打开状态。
查看您的代码,并尝试识别出您始终使用相同的样式。
例如,我看到您使用respPerson.addNotification(notification);
,因此还需要使用类似setId
的东西:
respPerson.setId(1L); // will work
respPerson.id = 1L; // will not work