【问题标题】:ebean update() sometimes does not persist objectebean update() 有时不持久化对象
【发布时间】:2015-11-16 23:47:22
【问题描述】:

我有一个很快就会投入使用的游戏应用程序(play v2.3.4 - with ebean)。在我这些天的测试中,我看到了一些非常奇怪的东西!有时用于在 DB 中持久化模型的 update() 方法不起作用(没有任何例外)。我正在寻找问题,直到现在我想到了这 3 个:

  1. 我使用的是 update() 而不是 update(id) ,也许这就是问题所在?
  2. 我正在使用没有 getter/setter 的公共字段,我发现这有时会产生问题,我得到了null,所以稍后我将更改为私有字段 + getter/setter。但是现在,这会是问题吗?
  3. 一旦我发现update()不适用于所有对象,我就做了activator clean,之后一切顺利。 (另一次清洁没有帮助)

例如,在我的代码中,我对一些对象进行了循环,在我的循环中,我更改了每个对象的属性,并为该对象调用 update()。对于他们中的一些人来说,这些变化会持续存在,对于一些人来说不会!!! (这种代码和平通过我的app/Global.java 中的 AKKA 调度程序定期执行)

for (User respPerson : event.setup.respPersons) {
   respPerson.addNotification(notification);
   respPerson.update();
}

更新: 从update() 更改为update(id) 并没有解决问题。 这是 2 个User 实例的调试器图片。右边的总是更新成功,左边的不...

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

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

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

【问题讨论】:

  • 什么最终解决了这个问题?

标签: playframework playframework-2.3 ebean


【解决方案1】:

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

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

例如,我看到你使用respPerson.addNotification(notification);,所以你也需要使用setId 之类的东西:

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

【讨论】:

  • 我的一些模型的所有字段都有 getter/setter,一些模型的所有公共字段都没有任何 getter/setter。我不确定 play 如何确定是否存在任何 getter/setter,但我假设它们使用 Java 反射,例如搜索“set”+fieldName。我用更多信息更新了我的问题。你还认为 setter/getter 有问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2014-06-23
  • 1970-01-01
  • 2014-11-13
  • 2012-05-08
  • 2020-12-05
  • 2018-01-21
相关资源
最近更新 更多