Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA/EclipseLink与连接表建立多对多关系_Java_Jpa_Eclipselink - Fatal编程技术网

Java 如何使用JPA/EclipseLink与连接表建立多对多关系

Java 如何使用JPA/EclipseLink与连接表建立多对多关系,java,jpa,eclipselink,Java,Jpa,Eclipselink,我有两张桌子: 电影: 电影ID 用户: 用户ID 这些表通过队列表具有多对多关系,其中 另一个属性listOrder: 队列: 电影导演, 用户ID, 列表顺序 我试图用EclipseLink来建模,但是我得到了一个 “不兼容映射”错误。以下是我的代码示例: @Entity @Table(name="movieinventory") public class Movie implements Serializable { private static final long se

我有两张桌子:

电影: 电影ID

用户: 用户ID

这些表通过队列表具有多对多关系,其中 另一个属性listOrder:

队列: 电影导演, 用户ID, 列表顺序

我试图用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和userID的键。我不能肯定这是正确的方法 去做吧

这就是错误: 异常描述:在之间遇到不兼容的映射 [class Movie]和[class QueueItem]。这通常发生在 映射的基数与映射的基数不一致 返回指针。我对用户类有相同的错误(错误交替出现)

当我从中的电影和用户变量中去掉@Id注释时 QueueItem并使其他一些键成为主键,但是,它使用 没有错误

如有任何建议,将不胜感激

谢谢,
B.J.

首先,正如Mike Cornell所建议的,EmbeddedId/类可能是更容易使用的选择。尽管如此,要回答您的问题并更正代码:

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

正如你所看到的,他们必须拥有他们必须匹配的id类型。不是很漂亮,但很实用。我建议对你的集合使用泛型;使ist更易于阅读,代码更安全。

您使用@IdClass而不是将QueueItemPK标记为@Embeddeble并将其插入@Id的原因是什么?