Java 如何使用JPA/EclipseLink与连接表建立多对多关系
我有两张桌子: 电影: 电影ID 用户: 用户ID 这些表通过队列表具有多对多关系,其中 另一个属性listOrder: 队列: 电影导演, 用户ID, 列表顺序 我试图用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
@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的原因是什么?