2

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

@Persistent
@Unowned
private Set<Role> roles;

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

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

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

4

3 回答 3

2

我看到同样的事情。当然,我是这一切的新手,但即使使用@Unowned,如果我从第一次持久化时所在的 ArrayList 中删除一个项目,该对象也会从数据存储中删除。似乎与我添加@Unowned 之前几乎相同。因此,我可以将对象从一个对象的 ArrayList 转移到另一个对象的唯一方法是在调用 remove() 之前先找到它,然后进行深层复制,然后我可以 remove() 并将副本放在另一个列表中. 一点都不自然。

于 2012-10-19T03:59:25.333 回答
1

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

要在不删除原始持久对象的情况下从父集合中删除子对象,您需要:

1)使用集合而不是列表

起初我只使用列表,A) 用于排序,B) 因为 Sets + RequestFactory ValueProxy 不起作用。所以一定要使用EntityProxy

2) 用@Unowned注释这个集合

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

3)不确定是否有必要,但我也用@Element(dependent = "false")进行了注释

希望这会帮助一些人。如果没有,好吧,没有伤害。

于 2013-10-22T14:34:02.630 回答
0

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

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

不幸的是,在我搬回JDO 2.0后它被修复了。在 JDO 2.0 中,我unowned使用collections of keys或使用foreign keys. 实际上这不是一个糟糕的解决方案,所以我不打算再次尝试JDO 3.0。对于我batch fetch用来获取子对象的键集合,如果是外键,我使用带有where语句的简单查询。有时最好使用第一种解决方案,有时使用第二种解决方案。无论如何,这一切都被一个干净的 API 所覆盖,因此最终的代码简单而“自然”。(我希望在文档中直接描述这种方法,这样我们就不必费力地学习它。)

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

于 2012-10-19T09:58:18.183 回答