Como você configura um relacionamento de muitos para muitos com a tabela de junit usando JPA / EclipseLink

Eu tenho 2 mesas:

Filmes: movieID

Usuários: userID

Essas tabelas têm muitos ou muitos relacionamentos através da tabela de Filas, com um atributo adicional, listOrder:

Fila: movieID, userID, listOrder

Eu estou tentando modelar isso usando o EclipseLink, mas estou recebendo um erro “mapeamento incompattible”. Aqui está uma amostra do meu código:

@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(); } } 

O objective do QueueItemPK é para que eu possa ter a chave primária composta de movieID e userID. Não tenho certeza absoluta de que essa é a maneira correta de fazer isso.

Este é o erro: Descrição da exceção: Um mapeamento incompatível foi encontrado entre [class Movie] e [class QueueItem]. Isso geralmente ocorre quando a cardinalidade de um mapeamento não corresponde à cardinalidade de seu backpointer. Eu tenho o mesmo erro com a class User (os erros alternam).

Quando pego as annotations @Id das variables ​​de filme e usuário em QueueItem e faço outra chave, a chave primária, no entanto, compila sem erros.

Qualquer sugestão seria apreciada.

Obrigado BJ

Primeiro de tudo, como sugerido por Mike Cornell, o EmbeddedId / Class é provavelmente a escolha mais fácil de usar. No entanto, para responder à sua pergunta e corrigir o código:

 @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; } } 

Como você pode ver, é necessário que eles tenham o tipo de id que eles devem combinar. não é muito bonito, mas funciona. E eu sugiro usar genéricos para seus Sets; torna mais fácil de ler e mais seguro para o código.