gpt4 book ai didi

java - 如何使用 JPA/EclipseLink 与联结表建立多对多关系

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:42:54 25 4
gpt4 key购买 nike

我有 2 个表:

电影: 电影ID

用户: 用户ID

这些表通过Queue表有多对多的关系,有一个额外的属性,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 的键。我不确定这是正确的方法去做。

这是错误:异常描述:之间遇到了不兼容的映射[类电影] 和 [类 QueueItem]。这通常发生在映射的基数与其映射的基数不对应backpointer。我有与 User 类相同的错误(错误交替出现)。

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

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

谢谢,B.J.

最佳答案

首先,正如 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 类型。不是很漂亮,但工作。我建议为你的集合使用泛型;使 ist 更易于阅读并更安全地编写代码。

关于java - 如何使用 JPA/EclipseLink 与联结表建立多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com