JEE Back-end

Retours sur les exercices sur les mappings Hibernate

Video version naive

@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;
    ...

}

Video version naive

@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 :(

Video better

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;    

    ...
}