JDO与众多关系无关

时间:2015-01-16 19:57:20

标签: java google-app-engine jdo

我正在使用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会创建圈子所拥有的用户实体并设置关系,但这不是我想要的行为。我希望我可以设置与现有用户实体的关系。

1 个答案:

答案 0 :(得分:1)

管理无主的多对多关系的最简单方法是在关系的两边保存一组Keys(请参阅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());
}