JDO unowned 多对多关系

JDO unowned many to many relationship

我正在使用 JDO 在 Google App Engine 中创建一个 Cloud Endpoint。我有两个实体。用户实体包含一个组列表。组实体包含一个成员列表,这些成员是用户实体。

用户实体:

@PersistenceCapable(identityType = IdentityType.APPLICATION) public class USER {
        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        Key userid;

        @Persistent
        String name; 

        @Persistent
        private Set<GROUP> groups; //getters setters

组实体

@PersistenceCapable(identityType = IdentityType.APPLICATION) public class GROUP {
        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        Key groupid;

        @Persistent
        String name;  

        @Persistent
        private Set<USER> members; //getters setters

我的API方法

@ApiMethod(name = "INSERT_CIRCLE")
    public wmcircle insertcircle(CIRCLE circle) {
        PersistenceManager mgr = getPersistenceManager();
        try {
            if (contains(circle)) {
                throw new EntityExistsException("Object already exists");
            }

            mgr.makePersistent(circle);
        } finally {
            mgr.close();
        }
        return circle;
    }

当我创建一个组时,GAE 会创建圈子拥有的用户实体并设置关系,但这不是我想要的行为。我希望我可以设置与现有用户实体的关系。

管理无主多对多关系的最简单方法是在关系的两侧保存一组键(参见GAE JDO Documentation)。因此,在您的情况下,实体将如下所示:

用户

...
@Persistent
private Set<Key> groups; 

//getters setters

public void addGroup(Group group) {
    groups.add(group.getKey());
    group.getMembers().add(this.getKey());
}

public void removeGroup(Group group) {
    groups.remove(group.getKey());
    group.getMembers().remove(this.getKey());
}

...
@Persistent
private Set<Key> members; 

//getters setters

public void addMember(User member) {
    members.add(member.getKey());
    member.getGroups().add(this.getKey());
}

public void removeMember(User member) {
    members.remove(member.getKey());
    member.getGroups().remove(this.getKey());
}