@Entity public class User implements WithId<String> { @Id private String username; ... }
@Entity public class Video implements WithId<Long> { @Id @GeneratedValue private Long id; private String name; ... }
@Entity public class Vote { public static enum VoteType {UPVOTE(1),DOWNVOTE(-1)}; @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private User user; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Video video; private VoteType voteType; ... }
Ce mapping ne garantie pas en BD qu'une personne ne peut pas voter plusieurs fois pour une même video :(
Une meilleure modélisation consiste à faire une clée composite Video + User.
public class VoteId implements Serializable { private User user; private Video video; ... }
@Entity @IdClass(VoteId.class) public class Vote { @Id @ManyToOne(fetch = FetchType.LAZY) private User user; @Id @ManyToOne(fetch = FetchType.LAZY) private Video video; private VoteType voteType; ... }