Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDO无主多对多关系_Java_Google App Engine_Jdo - Fatal编程技术网

Java JDO无主多对多关系

Java JDO无主多对多关系,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我正在使用JDO在Google App Engine中创建一个云端点。我有两个实体。用户实体包含组列表。组实体包含作为用户实体的成员列表 用户实体: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class USER { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

我正在使用JDO在Google App Engine中创建一个云端点。我有两个实体。用户实体包含组列表。组实体包含作为用户实体的成员列表

用户实体:

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

        @Persistent
        String name; 

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

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

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

使用者

。。。
@持久的
私有集合组;
//吸气剂二传手
公共无效添加组(组){
添加(group.getKey());
group.getMembers().add(this.getKey());
}
public void removeGroup(组){
groups.remove(group.getKey());
group.getMembers().remove(this.getKey());
}
团体

。。。
@持久的
私有集合成员;
//吸气剂二传手
public void addMember(用户成员){
add(member.getKey());
member.getGroups().add(this.getKey());
}
public void removember(用户成员){
members.remove(member.getKey());
member.getGroups().remove(this.getKey());
}

任何谷歌“无主”关系都需要在相应字段上显示@unowned,“mappedBy”感谢您的回答。这就是我要改变的全部,还是我也要改变API方法中的某些东西?我的API方法如下所示:
@ApiMethod(name=“insertuser”)公共用户insertuser(user user){PersistenceManager mgr=getPersistenceManager();尝试{if(user.getKey()!=null){if(containsuser(user)){抛出新的EntityExistsException(“对象已存在”);}}mgr.makePersistent(user);}最后{mgr.close();}return user;}
确定需要考虑的几件事:确保在添加密钥集时删除了“私有集组”和“私有集成员”;还要确保为密钥集添加getter/setter,以便JDO将其拾取(或使其公开)。在调用insertuser()之前在客户端,向用户添加任何组密钥。最后,在insertuser()中,迭代所有组密钥,并使用属于这些组的新用户更新这些实体。请记住:只要更新一方,就更新关系的另一方。希望这有帮助!
@PersistenceCapable(identityType = IdentityType.APPLICATION) public class GROUP {
        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        Key groupid;

        @Persistent
        String name;  

        @Persistent
        private Set<USER> members; //getters setters
@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;
    }
...
@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());
}