クラスを次のように構成します。
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;
}
評価テーブルは結合テーブルであり、User と Movie への参照があります。評価はユーザーと映画によって一意に識別されるため、関連付けは複合識別子内にあります (ユーザーが映画に対して複数の評価を投稿できない場合は?)。複合キーを使用すると、ユーザーが映画の評価を削除してから再度追加する場合に、キーの重複違反が発生しないことが保証されます。Hibernate は削除の前に挿入を行います。