2014-04-19 1 views
1

두 엔티티 사이에 관계가 있습니다.부모 엔티티에 대한 기존 자식 엔티티 할당 JPA-GAE

두 엔터티가 이미 만들어져 DB에 삽입되었습니다. 사용자는 어느 시점에서 이들 사이를 연결할 수 있습니다. 메신저는 점점 메신저 일을하려고하면 (WannaMeetUser로 식별 WannaMeetUser ("123456")의 부모로 WannaMeetUser ("654321")를 설립 감지 시도하지만 엔티티 :

javax.persistence.PersistenceException을 "123456")은 이미 부모없이 지속 된 입니다. 개체가 보존 된 후에 부모를 설정하거나 변경할 수 없습니다 ( ).

이 (사용자가 사용자의 왕에서 많은 친구를 가질 수 있습니다) 타동사의 관계입니다 :

코드가 부착되어

@Entity 
    public class WannaMeetUser { 

     @Id //signifies the primary key 
     @Column(name = "ID", nullable = false) 
     private Key id; 

      @ManyToMany 
      @Basic 
      private List<WannaMeetUser> userFriends = new ArrayList<WannaMeetUser>(); 
} 

public void addFriendToWannaMeetUser(@Named("userId") String userId, 
      @Named("friendId") String friendId) { 
     EntityManager mgr = getEntityManager(); 
     try 
     { 
      WannaMeetUser user = mgr.find(WannaMeetUser.class, WannaMeetServerUtils.getKeyFromString("WannaMeetUser", userId)); 
      WannaMeetUser friend = mgr.find(WannaMeetUser.class, WannaMeetServerUtils.getKeyFromString("WannaMeetUser", friendId)); 
      String coupleId = getcoupleId(userId.toString(), friendId.toString()); 
      if (friend == null || user == null) { 
       throw new EntityNotFoundException("Object does not exist"); 
      } 
      WannaMeetCouple couple=mgr.find(WannaMeetCouple.class, coupleId); 
      if (couple == null) { 
       couple = createCouple(userId.toString(), friendId.toString()); 
       couple.setId(coupleId); 
       setUserJoined(couple, userId.toString(), friendId.toString(), true); 
      } 
     else { 
      if (isFriendAllready(couple, userId.toString(), friendId.toString())) 
       ; 
      setUserJoined(couple, userId.toString(), friendId.toString(), false); 
      doAddFriend(user, friend, 10, 12321321); 
      mgr.persist(couple); 
      mgr.persist(friend); 
      mgr.persist(user); 
     } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally{ 
      mgr.close(); 
     } 

    } 

내 질문 상자 등을 가장 좋은 방법은 무엇입니까 관계 ?

감사

답변

0

메시지는 사용자 1이 이미 어떤 부모없이 지속되었다, 그러나 지금 우리는 사용자가 하나의 부모로서 사용자 2를 지속 을 시도하지만, 사용자 1은 부모가하지 알려져 말한다.

계단식을 사용하여 한 번에 모든 것을 유지하려고합니다. 이 같은 계단식 관계 선언 할 수

@ManyToMany(cascade=CascadeType.ALL) 
private List<User> userFriends; 

을 그리고 계단식 사용하여 한 번에 모든 것을 유지 :

User user1 = new User(); 
User user2 = new User(); 

user1.getUserFriends().add(user2); 

// this persists the whole tree in one go 
entityManager.persist(user1); 
+0

의견을 주셔서 감사합니다. 그러나 관계가 사용자 작성에 알려지지 않았으므로 제안 사항이 저에게 관련되지 않습니다. –

0

부모 - 자식 엔티티 (단지 변하지 않는 관계를 사용해야합니다 예를 들어, 사용자가 그리고 그의 사진). 동적 관계의 경우 세 가지 옵션이 있습니다.

(A) 다른 개체에 대한 참조를 속성 (예 : User 항목의 userFriends 속성)으로 저장합니다. 관계가 단방향 (예 : 사용자 A가 사용자 B를 좋아하는 경우) 인 경우 하나의 엔티티 만 업데이트 할 수 있습니다. 양방향 관계의 경우 두 엔티티를 모두 업데이트합니다.

(B) 새 엔티티 유형 만들기 두 속성 UserA 및 UserB와의 관계 필요에 따라이 엔티티를 만들고 삭제하십시오.

(C) 사용자 A가 사용자 B를 좋아할 때 사용자 A의 하위 엔티티로 새 엔티티 관계를 만들고이 새로운 관계 엔티티의 사용자 ID로 사용자 B의 ID를 사용하십시오.

이러한 옵션 중에서 선택하는 것은 데이터 모델 및 데이터 액세스 패턴에 따라 다릅니다.

+0

도움을 주셔서 감사합니다. 옵션 A와 관련하여 @ManyToMany 주석이없는 속성을 사용하셨습니까? –

+0

JPA가 Datastore API에 매핑되는 방식에 익숙하지 않습니다. http://stackoverflow.com/questions/8036420/jpa-and-many-to-many-relations-in-google-app-engine을 확인하십시오. –

관련 문제