【发布时间】: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