Java JDO无主多对多关系
我正在使用JDO在Google App Engine中创建一个云端点。我有两个实体。用户实体包含组列表。组实体包含作为用户实体的成员列表 用户实体: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)
@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());
}