我有一个简单的数据库布局。有三个表:
电影:move_id,title,...
用户:user_id,用户名,...
评级:评级,评论,......
我想使用评级表作为中介,因为它包含以下列:rating,comment,user_id,movie_id。
我知道这不是你想要做的事情,而是为评级创建另一个表并拥有它自己的PK,但你如何在Hibernate中实现这个结构?
感谢。
答案 0 :(得分:0)
您可以使用具有user_id和movie_id的复合主键作为您的评级实体。
答案 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会在删除之前插入。