我应该如何在Hibernate / Spring中实现它?

时间:2012-06-22 15:49:00

标签: hibernate spring-mvc relational-database

我有一个简单的数据库布局。有三个表:
电影:move_id,title,...
用户:user_id,用户名,...
评级:评级,评论,......

我想使用评级表作为中介,因为它包含以下列:rating,comment,user_id,movie_id。

我知道这不是你想要做的事情,而是为评级创建另一个表并拥有它自己的PK,但你如何在Hibernate中实现这个结构?

感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用具有user_id和movie_id的复合主键作为您的评级实体。

请参阅http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-compositeid

答案 1 :(得分:0)

我会像这样构建我的类:

public class Movie {

  @Id
  @GeneratedValue
  private long id;

  private String name;

  @OneToMany(mappedBy = "id.movie")
  private List<Rating> ratings

}

public class Rating {

  @Embeddable
  public static class RatingId {

  @ManyToOne
  @JoinColumn(name = "movieId")
  private Movie movie;

  @ManyToOne
  @JoinColumn(name = "userId)
  private User user;

 // Equals and Hashcode which should check the associated tables @Ids

  }

  @EmbeddedId
  private RatingId id;

  private String comment;

  private int rating;

}

public class User {

  @Id
  @GeneratedValue
  private long id;


  private String userName;
}

评级表是一个连接表,包含对用户和电影的引用。这些关联在复合标识符内,因为评级是用户和电影的唯一标识符(除非用户可以为电影发布多个评级?)。使用复合键将确保如果用户要删除然后重新添加电影的评级,则不会出现重复的键违规 - Hibernate会在删除之前插入。