クラスを次のように構成します。
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 は削除の前に挿入を行います。