Como fazer uma consulta JPA com mapeamentos @ManyToMany

10 respostas
jpa
C

Bom dia.

Estou com dificuldades em realizar uma consulta na base de dados onde minha entidade Employee tem 2 mapeamentos @ManyToMany e 1 mapeamento @ManyToOne. Ao realizar uma consulta os dados de Employee e Projects são retornados sem maiores problemas. Os atributos relacionais do ManyToMany que está sendo um problema. Para fazer a inserção está ocorrendo ok. Para buscar na base um problema. Alguém pode ajudar por gentileza? Obrigado

10 Respostas

J

Faltou dizer qual problema. No geral como fazer, google: @ManyToMany JPA.

C

@javaflex para fazer inserção estou conseguindo. Retornar os dados para o Postman no caso que estou testando que não funciona. Vou disponibilizar o que eu fiz

J

“Não funciona” é muito vago.

C

Não estou conseguindo disponibilizar pois sou novo no forum. Mas tenho uma Classe employee que contém um mapeamento manytomany para uma classe skill. criei uma classe associativa de employee_skill com os id de cada uma dela.
O que desejo é: quando eu consultar os employee, que venha junto as skills dele.
Ao fazer a busca com findAll em employee, o atributo List fica com uma propriedade PersistenceBag. Com isso não consigo obter os dados para retornar todas as informações ao Postman

C

Fiz também um debug agora e o erro que ocorreu é o seguinte:

2018-12-22 11:51:32.069 WARN 6064 — [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

J

No geral, segue um exemplo: https://www.baeldung.com/hibernate-many-to-many

Pra alguem te ajudar vai ser importante postar como está configurado o mapeamento e como está programando a consulta. Se o botao de formatar do forum nao funcionar, use ```:

```
Cole aqui seu codigo
```
C
@Entity
@Table(name = "employee")
@JsonView
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id_employee;

    @NotNull
    @Column(name = "name", length = 120)
    private String name;

    @NotNull
    @Column(name = "role", length = 100)
    private String role;

    @NotNull
    private Double salary;

    @NotNull
    @Column(name = "manager", length = 120)
    private String manager;

    private int gcm;

    @NotNull
    @ManyToOne
    private Projects project;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "employee_skill",
        joinColumns = @JoinColumn(name = "id_employee"),
        inverseJoinColumns = @JoinColumn(name = "id_skill")
    )

    private List<Skill> skill;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "employee_certification",
        joinColumns = @JoinColumn(name = "id_employee"),
        inverseJoinColumns = @JoinColumn(name = "id_certification")
    )

    private List<Certification> certification;
}
Classe skill

@Entity
@Table(name = "skill")
@JsonView
public class Skill implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id_skill;

    @NotNull
    private String descricao;

    @ManyToMany(mappedBy = "skill", fetch = FetchType.LAZY)
    private List<Employee> employee;

    public Skill(){}
}
Classe certification

@Entity
@Table(name = "certification")
@JsonView
public class Certification implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id_certification;

    @NotNull
    private String descricao;

    @ManyToMany(mappedBy = "certification", cascade = CascadeType.ALL)
    private List<Employee> employee;

    public Certification(){}

    public Certification(String descricao){
        this.descricao = descricao;
    }
}
Classe projects

@Entity
@Table(name = "projects")
@JsonView
public class Projects implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id_project;

    @Column(name = "name", length = 150)
    private String name;

    @Column(name = "customer", length = 100)
    private String customer;

    private Double valueOfProject;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_Begin")
    private Calendar dtBegin;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dt_End")
    private Calendar dtEnd;

    @OneToMany(mappedBy = "project")
    private List<Employee> employee;

    public Projects(){}

}
C
A busca estou tentando dessa forma : @Query(select e from Employee e JOIN e.skill s where s.id_skill =:id)

List findByNome(@Param(id)Integer id);

Com isso desejo trazer as skills de um colaborador passando o Id
J

Nao tem haver com o problema, mas a primeira coisa, ao invés de usar bag use set:

Faz algum tutorial como este e depois aplique no seu projeto o que aprendeu.

C

Agradeço a dica. Vou fazer. Obrigado

Criado 22 de dezembro de 2018
Ultima resposta 22 de dez. de 2018
Respostas 10
Participantes 2