5
respostas

Nova movimentação com Categoria dá erro

Na aula que insere uma movimentação com 2 categorias a primeira vez que você roda funciona, na segunda fez, para tentar inserir nova movimentação com categoria dá um erro, dizendo que já existe a chave primária na tabela Movimentacao_Categoria. Isso está acontecendo pq o JPA / Hibernate está criando uma UNIQUE KEY pela categorias_id nessa tabela, de modo que só é possível inserir uma categoria uma única vez nessa tabela. Está faltando algum parâmetro na criação da relação em Movimentacao @OneToMany private List categorias = new ArrayList<>();

ALTER TABLE [dbo].[Movimentacao_Categoria] ADD  CONSTRAINT [UK_nf3ulaoqe53gtm70wfwnpl79x] UNIQUE NONCLUSTERED 
(
    [categorias_id] ASC
5 respostas

Eu já descobri o problema. Na Classe Movimentacao, a relação com a tabela Categoria é uma relação de muitos para muitos.

Deveria ter sido criada como

    @ManyToMany
    private List<Categoria> categorias = new ArrayList<>();

E não como

@OneToMany

Perfeito, ALEXANDRE. Obrigado pela solução.

Só que agora o outro exercício parou de funcionar...rs.

public class TesteJPQLMovimentoUmaCategoria {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("contas"); //o nome contas vem do arquivo de persistencia
        EntityManager em = emf.createEntityManager();

        Categoria categoria = new Categoria();
        categoria.setId(1L);

        String jpsql = "select m from Movimentacao m join m.categoria c where c = :pCategorias";

        //informo tipo de query que a lista deverá retornars
        TypedQuery <Movimentacao> query = em.createQuery(jpsql, Movimentacao.class);
        query.setParameter("pCategorias", categoria);

        List<Movimentacao> resultList = query.getResultList();
        for (Movimentacao movimentacao : resultList) {
            System.out.println("Descrição:"  + movimentacao.getDescricao());
            System.out.println("Tipo:" + movimentacao.getTipoMovimentacao());
            System.out.println("Valor:" + movimentacao.getValor());
            System.out.println("Categoria:" + movimentacao.getCategorias());
        }

        emf.close();
    }

}

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: categoria of: br.com.alura.jpa.modelo.Movimentacao [select m from br.com.alura.jpa.modelo.Movimentacao m join m.categoria c where c = :pCategorias]

Além disso, antes quando a relação estava @ManyToOne não trazia só as movimentações da categoria 1 passada como argumento, mas de todas as categorias.

Esse erro ai eu não estou conseguindo resolver.

public class Movimentacao {

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

    private BigDecimal valor;

    //cria um  enum para validar os valores possíveis do campo - Domínio
    @Enumerated( EnumType.STRING)
    private TipoMovimentacao tipoMovimentacao  ;

    private LocalDateTime data;
    private String descricao;

    @ManyToOne
    private Conta conta;

    @ManyToMany
    private List<Categoria> categorias = new ArrayList<>();



}
String jpsql = "select m from Movimentacao m join m.categorias c where c = :pCategorias";

Agora coloquei no plurar... m.categorias e voltou a funcionar