我有一个简单的数据库布局。共有三个表:
Movie: move_id, title, ...
User: user_id, username, ...
Rating: rating, comment, ...
我想使用评级表作为中介,因为它由以下列组成:评级、评论、user_id、movie_id。
我知道这不是您想要做的事情的方式,而是为评级创建另一个表并拥有自己的 PK,但是您将如何在 Hibernate 中实现这种结构?
谢谢。
我有一个简单的数据库布局。共有三个表:
Movie: move_id, title, ...
User: user_id, username, ...
Rating: rating, comment, ...
我想使用评级表作为中介,因为它由以下列组成:评级、评论、user_id、movie_id。
我知道这不是您想要做的事情的方式,而是为评级创建另一个表并拥有自己的 PK,但是您将如何在 Hibernate 中实现这种结构?
谢谢。
您可以为 Rating 实体使用带有 user_id 和 movie_id 的复合主键。
我会像这样构建我的课程:
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;
}
评级表是一个连接表,并引用了用户和电影。关联位于复合标识符内,因为 Rating 是用户和电影的唯一标识符(除非用户可以发布电影的多个评分?)。使用复合键将确保如果用户要删除然后重新添加电影的评分,则不会出现重复的键违规 - Hibernate 在删除之前会插入。