我有两张桌子:
影: movieID
用户: 用户ID
这些表通过Queue表有多对多的关系 另一个属性,listOrder:
队列: movieID, 用户身份, 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和userID的关键字。我不完全确定这是正确的方法 这样做。
这是错误: 异常说明:遇到了不兼容的映射 [class Movie]和[class QueueItem]。这通常发生在 映射的基数与其基数不对应 backpointer。我和User类有相同的错误(错误交替)。
当我从电影和用户变量中取出@Id注释时 QueueItem并将其他键作为主键,但是,它会编译 没有错误。
任何建议都将不胜感激。
谢谢, B.J。
答案 0 :(得分:2)
首先,正如Mike Cornell所建议的那样,EmbeddedId / Class可能是更容易使用的选择。尽管如此,要回答您的问题并更正代码:
@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类型是必要的。不是很漂亮,但工作。我建议在你的套装中使用泛型;使得更容易阅读,更安全的代码。