【问题标题】:GAE - List does not persist after removing an object (DataNucleus & JDO)GAE - 删除对象后列表不存在(DataNucleus 和 JDO)
【发布时间】:2012-05-10 18:39:54
【问题描述】:

我有一个实体,我的属性之一是对象的 ArrayList,它是序列化的。我正在尝试删除列表中的一个元素并保留该实体。在本地一切正常,但在部署时却不行。

我的代码:

@Inject
public Repository<User> userRepo;
...
Leader leader = (Leader) item.getModelObject();
...
MySession.get().getUser().getLeaders().remove(leader);
JDOHelper.makeDirty(MySession.get().getUser(), "leaders");
userRepo.persist(MySession.get().getUser());

用户实体中的属性定义:

@Persistent(defaultFetchGroup = "true", serialized = "true")
@Extension(vendorName = "datanucleus", key = "gae.unindexed", value = "true")
private ArrayList<Leader> leaders = new ArrayList<Leader>();

我正在使用 datanucleus-core 版本 1.1.6、jdo2-api 2.3-eb 和 datanucleus-appengine 1.0.10

当我向列表中添加新项目时它可以正常工作,但当我删除某些内容时就不行 - 为什么会这样?我怎样才能让它发挥作用?

【问题讨论】:

  • 请出示您的代码。在没有看到代码的情况下,我们充其量只能进行推测,并且只能做出没有根据的猜测。
  • 好的,我已经用更多细节更新了我的问题。我希望这就足够了。
  • 我曾经在 datanucleus 自己决定不保存对象时遇到很多麻烦。您可以在 FINE 级别日志中查看这些对象状态和决策
  • 我很确定弄脏东西会迫使它总是保存...
  • 我发现我必须从对象中提取集合,然后使用 setter 属性重新添加整个集合。换句话说,如果没有实例化一个新集合然后使用对象上的 setter 将集合重新设置在它上面,我就没有运气调用 remove 。尝试调用 remove 然后在用户对象中重置您的对象,然后在 MySession 中设置用户。 DataNucleus 可能无法处理对象在会话中被修改的事实。这部分当然是我的纯粹猜测,这就是为什么它是评论而不是答案

标签: java google-app-engine jdo datanucleus


【解决方案1】:

把东西弄脏了就弄脏了,仅此而已;在...开始下一个事务(根据 JDO/JPA 规范)或关闭 PM/EM 之后发生持久/刷新;没有调用 makePersistent/persist 会改变这一点。这不是 DataNucleus “自己决定”不持久化一个对象,它只是遵循规范。

如果您使用最新的 GAE 版本 (v2.0),您可以使用非事务性原子持久/删除(对规范的扩展)。如果您使用 SVN 中继(v2.1),您还可以进行非事务性原子更新(进一步扩展)。即使用最新的代码,你有相当于 JDBC“自动提交”

【讨论】:

  • 我知道它背后一定有一些逻辑,但我对它周围的一切的了解非常有限。 2.0版本够稳定吗?我只记得它的测试版。将来我肯定会升级,因为我的版本在 DataNucleus 功能方面非常古老。我怎样才能在当前版本中实现我想要的?那是如何确保在我持久化对象时保存所有更改?因为对象是持久化的,这只是集合/序列化字段没有被持久化的问题。
  • 2.x 通过了比 Googles v1.x 更多的测试,所以这在我的书中是“稳定的”;-) 什么适用于 v1.0 我无法真正回答,只能猜测.. . 谷歌编写了他们插件的那个版本。试试周围的txn?尝试在之后放置一个 txn 开始/提交。查看日志,看看会发生什么 a)。在使它变脏时,b)。在 txn 开始/提交时。
  • 我想更新到 2.x 将是我最好的选择。
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多