我有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更容易阅读和更安全的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top