2015-01-16 2 views
1

Я создаю конечную точку облака в Google App Engine с JDO. У меня два объекта. Пользовательский элемент содержит список групп. Объект группы содержит список членов, являющихся пользовательскими объектами.JDO unowned many to many relationship

Entity Пользователь:

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

     @Persistent 
     String name; 

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

Группа Entity

@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 создает пользовательские объекты, которым владеет круг, и устанавливает отношения, но это не то поведение, которое я хочу. Я хочу, чтобы установить связь с существующими пользовательскими объектами.

+0

любого Google "бесхозные" отношения должны @Unowned на соответствующих полях, и «mappedBy» –

ответ

1

Простейший способ управления отношениями «многие-ко-многим» - сохранить коллекцию ключей по обе стороны от отношения (см. 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()); 
} 
+0

Спасибо за ваш ответ. Это все, что мне нужно изменить, или я должен что-то изменить в своем методе API? Мой метод API выглядит следующим образом: '@ApiMethod (имя = "insertuser") \t общего пользователя insertuser (пользователя) { \t \t PersistenceManager прил = getPersistenceManager(); \t \t попробовать { \t \t \t если (user.getKey()! = NULL) { \t \t \t \t если (containsuser (пользователь)) { \t \t \t \t \t бросить новый EntityExistsException ("Объект уже существует") ; \t \t \t \t} \t \t \t} \t \t \t \t \t \t mgr.makePersistent (пользователь); \t \t} finally { \t \t \t mgr.Закрыть(); \t \t} \t \t return user; \t} ' – Equalizer

+0

OK несколько вещей для вас: убедитесь, что вы удалили« private Set groups; »и« private Set членов; » при добавлении наборов клавиш. Также убедитесь, что вы добавляете геттеры/сеттеры для наборов ключей, поэтому JDO выбирает их (или делает их общедоступными). Прежде чем вы вызовете insertuser() на стороне клиента, добавьте к нему любые групповые ключи. Наконец, в insertuser(), итерации через любые групповые ключи и обновление этих объектов с этим новым пользователем, который является частью этих групп. Просто помните: обновляйте другую сторону отношений всякий раз, когда вы обновляете одну сторону. Надеюсь это поможет! –

+0

Спасибо, приятель !!! Наконец я сделал это. – Equalizer