Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Não entendi a cardinalidade @ManyToMany

Minha dúvida ficou sobre a cardinalidade @ManyToMany, vamos colocar outro exemplo aqui: No caso tenho duas tabelas, médicos e especialidades e são de muitos para muitos Insira aqui a descrição dessa imagem para ajudar na acessibilidadePorém, quando se tem este tipo de cardinalidade, é criado uma terceira tabela: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Da forma apresentada acima, na classe Medico teria um atributoque seria uma lista de especialidade @OneToMany e na classe EspecialidadesMedica teria um atributo do tipo Medico @ManyToOne.

Caso opte por não colocar ali a tabela especialidades_medica, teria um atributo na classe Medico com tipo de lista chamado especialidades e colocaria @ManyToMany e @JoinTable("especialidade") ?

OBS: Ficou esta dúvida, porque acho que desta forma apresentada não tem muito sentido o @ManyToMany, porque quando se tem isso eu acabo criando uma tabela como a "especialidades_medica".

2 respostas
solução!

Oi!

A cardinalidade vai depender das regras da aplicação.

Se na sua aplicação o médico pode ter apenas uma especialidade, então será um relacionamento manyToOne:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A tabela de especialidades tem o cadastro de todas as especialidades:

idnome
8Ortopedia
9Cardiologia
10Oftalmologia

E na tabela de médicos cada médico tem o id da especialidade que ele pertence:

idnomecrmstatusespecialidade_id
32Ana123456110
33Pedro22233318
34Rodrigo44455509
35Raquel77788818

Agora, se na aplicação um médico pode ter múltiplas especialidades, então será necessário uma terceira tabela para armazenar as especialidades de cada médico (pois não sabemos quantas especialidades podem ser, então não dá para saber quantas colunas seriam necessárias na tabela de medicos):

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

idnome
8Ortopedia
9Cardiologia
10Oftalmologia
idnomecrmstatus
32Ana1234561
33Pedro2223331
34Rodrigo4445550
35Raquel7778881
id_medicoid_especialidade
328
3210
3310
348
349
3410
359

No primeiro caso o mapeamento JPA seria assim:

@Entity
@Table(name = "medicos")
public class Medico {

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

    @ManyToOne
    private Especialidade especialidade;

    //outros atributos, metodos, etc.

}
@Entity
@Table(name = "especialidades")
public class Especialidade {

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

    //outros atributos, metodos, etc.

}

Já no segundo caso, seria assim:

@Entity
@Table(name = "medicos")
public class Medico {

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

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "especialidades_medicos", 
        joinColumns = @JoinColumn(name = "medico_id"),
        inverseJoinColumns = @JoinColumn(name = "especialidade_id")
    )
    private List<Especialidade> especialidades = new ArrayList<>();

    //outros atributos, metodos, etc.
}
@Entity
@Table(name = "especialidades")
public class Especialidade {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    
    @ManyToMany(mappedBy = "especialidades")
    private List<Medico> medicos = new ArrayList<>();

    //outros atributos, metodos, etc.
}

Aahhhh Rodrigo agora com a sua resposta, consegui visualizar a usabilidade do @ManyToMany. Quando temos uma entidade associativa ("especialidades_medicos"), caso esta entidade não tenha atributos além dos Id's das outras tabelas realizao o @ManyToMany caso contrário realizo @OneToMany ou @ManyToOne (depende da regra de negócio da aplicação).

Me ajudou muito mesmo, valeu Rodrigo !