2
respostas

Restrição no ManyToMany

Olá, estou tentando criar um relacionamento ManyToMany com as entidades, que estarão abaixo, Aluno e Disciplina.

Ocorre que consigo persistir sem problemas, porém gostaria de adicionar uma restrição, que da forma que estou mapeando não está sendo adicionada:

Ao cadastrar Aluno com disciplinas, ele pode cursar, por exemplo, Português e Matemática, o que está correto. Porém eu consigo duplicar, exemplo:

João cursa Matemática, Português e Matemática.

Queria adicionar uma restrição para que isso não ocorresse, como poderia fazer isso?

Seguem as classes mapeadas:

Aluno

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 11, unique = true)
    private String cpf;

    @Column(length = 25)
    private String nome;

    @Column(length = 25)
    private String ultimoSobrenome;

    @ManyToMany
    private List<Disciplina> disciplinas;

Disciplina

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    @Enumerated(EnumType.STRING)
    private DisciplinasDisponiveis nome;

    @ManyToMany(mappedBy = "disciplinas")
    private List<Aluno> alunos;

Exemplo de como está agora e do que queria evitar:

+-----------+----------------+
| alunos_id | disciplinas_id |
+-----------+----------------+
|         1 |              1 |
|         1 |              2 |
|         1 |              5 |
|         1 |              1 |
+-----------+----------------+
2 respostas

Fala Falcão, tudo bem?

Você pode criar um Composite Primary Key vinculando ID, ALUNOS_ID e DISCIPLINAS_ID

https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/

Olá, Otávio, obrigado pela resposta.

Ocorre que ao utilizar chave composta no meu caso, que de fato resolveria meu problema, infelizmente me impediria de utilizar também um id numérico auto_increment através das tag @GeneratedValue, o que não queria perder, entende?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software