ebean update()有时不会持久化对象

时间:2015-11-16 23:47:23

标签: playframework playframework-2.3 ebean

我有一个播放应用程序(播放v2.3.4 - 使用ebean)即将投入使用。在我这些天的测试中,我看到一些非常奇怪的东西!有时用于在DB中持久化模型的update()方法不起作用(没有任何例外)。我正在寻找这个问题,直到现在我还记得这三个问题:

  1. 我使用update()而不是update(id),这可能就是问题吗?
  2. 我使用没有getter / setter的公共字段,我看到这有时会产生问题而我会回到null,所以我稍后会更改为私有字段+ getter / setter。但是现在,这可能是问题吗?
  3. 一旦我发现update()对所有对象都无法正常工作,我做了activator clean之后,事情进展顺利。 (另一次这次清洁没有帮助)
  4. 例如,在我的代码中,我在一些对象上循环,在我的循环中,我更改了每个对象的属性,并为该对象调用update()。对于其中一些人来说,变化会持续存在,有些则不会! (这个代码的和平通过我的app/Global.java

    中的AKKA调度程序定期执行
    for (User respPerson : event.setup.respPersons) {
       respPerson.addNotification(notification);
       respPerson.update();
    }
    

    更新: 从update()更改为update(id)并未解决问题。 这是2 User个实例的调试器图片。正确的更新总是成功,左边的不是...... enter image description here

    UPDATE2 有关上述示例的更多信息: 在内部循环中,我向User实例添加通知(用户持有List个通知)。现在,如果我使用调试器检查User实例,则其中有一个新的Notification通知列表。所以一切都应该没问题...然后我调用update(),并期望更改应该保留在DB中。但在update之后,当我使用静态调用并从数据库获取User id时,它不包含我之前添加的通知!

    这总是发生在Object的特定实例上(在上图中,id为33的用户)。我尝试在另一个Notification中向此User个实例添加controller,并且它已被保留。但每次我使用计划任务在Global.java内执行此操作时,都不会保持持久性。

    UPDATE!找到并修复了问题。我会在接下来的几个小时内更新这个问题。

1 个答案:

答案 0 :(得分:0)

也许你混合了公共属性和getter \ setters? Ebean(Play)自动生成getter \ setter如果你不在模型中创建它们,否则你需要创建所有这些。您可以关闭此功能,但默认情况下它已打开。

查看您的代码并尝试识别您始终使用相同的样式。

例如,我发现您使用respPerson.addNotification(notification);,因此您还需要使用setId之类的内容:

respPerson.setId(1L); // will work 
respPerson.id = 1L;   // will not work