AppEngine中的JDO:从无主关系中删除时保留原始实体

时间:2012-08-07 10:41:03

标签: java google-app-engine jdo

我使用JDO 3.0语法定义了一个无主关系:

@Persistent
@Unowned
private Set<Role> roles;

我有几个应该分配给用户的预定义角色。我使用以下代码向用户添加/删除角色:

roles.add(roleEntity);
roles.remove(roleEntity); 

问题是像这样删除也会从数据存储中删除原始实体,但我只是想删除引用。我知道我只能在父实体中存储可以解决问题的密钥,但是有更好的解决方案吗?使用这种“自然”语法?

3 个答案:

答案 0 :(得分:2)

我看到了同样的事情。我承认我是这一切的新手,但即使是@Unowned 如果我从第一个持久化的ArrayList中删除一个项目 object从数据存储中删除。看起来和我之前添加的几乎一样 @Unowned。所以我可以从一个对象的ArrayList传输对象的唯一方法 另一个是在调用remove()之前先找到它,然后进行深层复制, 然后我可以删除()并将副本放在另一个列表中。一点都不自然。

答案 1 :(得分:1)

由于我多年来一直在努力解决这个问题,让我分享最终适合我的解决方案。谁知道,它可能对其他人有帮助,因为文件不是很有帮助。

要从父级集合中删除子级而不删除原始的persitent对象,您需要:

1)使用设置而不是列表

起初我只使用Lists,A)进行排序和B)因为Sets + RequestFactory ValueProxy不起作用。因此,请务必使用 EntityProxy

2)使用 @Unowned

激活此设置

他们没有将这个注释放在他们的无主一对多示例中:https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Unowned_Relationships 但是如果没有它,当你尝试向你的集合中添加一个元素(不能改变父元素)时会出现异常

3)不确定是否有必要,但我也注明了 @Element(dependent =“false”)

希望这会对一些人有所帮助。如果没有,那么,没有伤害。

答案 2 :(得分:0)

我想这个问题值得一个真正的最终答案。

所描述的行为是由JDO中的错误引起的,现在应该修复它。有关详细信息,请参阅http://code.google.com/p/datanucleus-appengine/issues/detail?id=290。另请注意,无论文档说什么,owned关系总是 dependent

不幸的是,在我回到 JDO 2.0 后,它已得到修复。在JDO 2.0中,我使用unownedcollections of keys来实现foreign keys关系。实际上这不是一个糟糕的解决方案,因此我不打算再次尝试 JDO 3.0 。对于一组键,我使用batch fetch来获取子对象,如果是外键,我使用带有where语句的简单查询。有时最好使用第一种解决方案,有时候使用第二种解决方案。无论如何,它都被一个干净的API覆盖,所以最终的代码很简单,“自然”。 (我希望这种方法直接在文档中描述,因此我们不必以艰难的方式学习它。)

重要的是,在这两种情况下,我都可以在不删除原始实体的情况下破坏关系。这是一个真正的unowned关系。