你如何建立与结表使用JPA / EclipseLink的多对一对多的关系
-
22-08-2019 - |
题
我有2个表:
影: movieID
用户: 用户ID
这些表具有许多通过所述队列表一对多的关系,用 附加属性,listOrder:
队列: movieID, 用户身份, listOrder
我试图使用的EclipseLink来模拟这一点,但我得到的 “incompattible映射”错误。下面是我的代码采样:
@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]。这通常发生在 的映射的基数不与的基数对应其 反向指针。强>我与用户类相同的错误(错误候补)。
当我走@Id注解离开电影和用户变量的中 QueueItem并作出其他一些重要的主键,但是,它与编译 没有错误。
任何建议,将不胜感激。
谢谢, B.J。
解决方案
首先,由麦克康奈尔如所建议的,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更容易阅读和更安全的代码。
不隶属于 StackOverflow