2009-05-18 2 views
3

를 사용하여 접합 표와의 관계 내가 2 개 테이블이 설정합니까어떻게 당신은이 대다 JPA /는 EclipseLink

큐 : movieID, userI 추가 속성 listOrder와, 큐 테이블을 통해 다수의 관계에 많은 D, listOrder

EclipseLink를 사용하여 이것을 모델링하려고 시도했지만 "호환되지 않는 매핑"오류가 발생합니다.


@Entity 
@Table(name="movieinventory") 
public class Movie implements Serializable 
{ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue 
     private Integer movieID; 

     @OneToMany(mappedBy="movie") 
     private Set moviesInQueue; 

     ...Getters/Setters... 
} 

@Entity 
@Table(name="Users") 
public class User implements Serializable 
{ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue 
     private Integer userID; 

     @OneToMany(mappedBy="user") 
     private Set moviesInQueue; 

     ...Getters/Setters... 
} 

@IdClass(QueueItemPK.class) 
@Entity 
@Table(name="queue") 
public class QueueItem 
{ 
     @Id 
     @ManyToOne 
     @JoinColumn(name="movieID") 
     private Movie movie; 

     @Id 
     @ManyToOne 
     @JoinColumn(name="userID") 
     private User user; 

     @Basic 
     private String listOrder; 

     ...Getters/Setters... 
} 

public class QueueItemPK implements Serializable 
{ 
     private static final long serialVersionUID = 1L; 

     private Movie movie; 
     private User user; 

     ...Getters/Setter... 

     public int hashCode() 
     { 
      return (movie.getMovieID() + "|" + user.getUserID()).hashCode(); 
     } 

     public boolean equals(Object obj) 
     { 
      if (obj == this) return true; 
      if (obj == null) return false; 
      if (!(obj instanceof QueueItemPK)) return false; 
      QueueItemPK pk = (QueueItemPK) obj; 
      return pk.movie.getMovieID() == movie.getMovieID() 
       && pk.user.getUserID() == user.getUserID(); 
     } 
} 

QueueItemPK의 목적은 내가 movieID와 사용자 ID의 복합 차 키를 가질 수 있도록입니다 : 여기에 내 코드의 샘플입니다. 나는 이것이 올바른 방법이라는 것을 절대적으로 확신하지 못합니다. . 예외 설명 :

는 오류가 호환되지 않는 매핑이 [클래스 영화] 및 [클래스 QueueItem] 사이에 발생했습니다. 대개 매핑의 카디널리티가 백 포인터의 카디널리티와 일치하지 않을 때 발생합니다. User 클래스에서 동일한 오류가 발생했습니다 (오류가 번갈아 나타남).

QueueItem의 영화 및 사용자 변수에서 @Id 주석을 제거하고 기본 키를 다른 키로 만들면 오류없이 컴파일됩니다.

의견을 보내 주시면 감사하겠습니다. 마이크 코넬에 의해 제안

감사합니다, 모두의 비제이

+0

QueueItemPK를 @Embeddable로 표시하고 @Id로 삽입하는 대신 @IdClass를 사용하게 된 이유는 무엇입니까? –

답변

2

첫째,의 EmbeddedId/클래스 아마도 쉽게 사용할 수있는 선택입니다. 그럼에도 불구하고, 귀하의 질문에 응답하고 코드를 수정합니다 : 당신이 그들이 일치했습니다는 ID의 형식을 가지고이 켜지지입니다 볼 수 있듯이

@IdClass(QueueItemPK.class) 
@Entity 
@Table(name="queue") 
public class QueueItem 
{ 
     @Id 
     @ManyToOne(optional=false) 
     @PrimaryKeyJoinColumn(name="movieID") 
     private Movie movie; 

     @Id 
     @ManyToOne(optional=false) 
     @PrimaryKeyJoinColumn(name="userID") 
     private User user; 

     @Basic 
     private String listOrder; 

     ...Getters/Setters... 
} 

public class QueueItemPK implements Serializable 
{ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @Column(name="movieID") 
     private Integer movie; 
     @Id 
     @Column(name="userID") 
     private Integer user; 

     ...Getters/Setter... 

     public int hashCode() 
     { 
      return (movie.getMovieID() + "|" + user.getUserID()).hashCode(); 
     } 

     public boolean equals(Object obj) 
     { 
      if (obj == this) return true; 
      if (obj == null) return false; 
      if (!(obj instanceof QueueItemPK)) return false; 
      QueueItemPK pk = (QueueItemPK) obj; 
      return pk.movie == movie 
       && pk.user == user; 
     } 
} 

합니다. 별로 아름답 지 않지만 일하고 있습니다. 그리고 귀하의 세트에 제네릭을 사용하는 것이 좋습니다; 읽기 쉽고 코드를보다 안전하게 유지할 수 있습니다.

관련 문제