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

insert JPA

Boa noite, galera! Tive um problema fazendo um projeto no spring com jpa. Seguinte.. Criei a classe Produto e mapiei certinho como entidade, e nesta classe fiz uma lista de preço(neste atributo do tipo List eu mapiei certinho com @ElementCollection ) e na classe Preco mapiei com @Embeddable, Quando cadastro produto era pro hibernate criar as duas tabelas, Produto e produto_precos, e fazer a inserção, porém só está criando a tabela produto e inserindo. Vou mostrar o código.

classe produto

package br.com.casadocodigo.loja.models;

import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Produto {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;

    @ElementCollection
    private List<Preco> precos;

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getPaginas() {
        return paginas;
    }
    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Preco> getPreco() {
        return precos;
    }

    public void setPreco(List<Preco> precos) {
        this.precos = precos;
    }

    @Override
    public String toString() {
        return "Produto [titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas + "]";
    }

Classe preco

package br.com.casadocodigo.loja.models;

import java.math.BigDecimal;

import javax.persistence.Embeddable;

@Embeddable
public class Preco {

    private BigDecimal valor;
    private TipoPreco tipo;

    public BigDecimal getValor() {
        return valor;
    }
    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }
    public TipoPreco getTipo() {
        return tipo;
    }
    public void setTipo(TipoPreco tipo) {
        this.tipo = tipo;
    }


}

E a classe TipoPreco

package br.com.casadocodigo.loja.models;

public enum TipoPreco {

    EBOOK, IMPRESSO, COMBO;

}

e a JpaConfigration

package br.com.casadocodigo.loja.conf;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean factoryBean = 
                new LocalContainerEntityManagerFactoryBean();

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("");
        dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");

        factoryBean.setDataSource(dataSource);

        Properties props = new Properties();
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "update");
        factoryBean.setJpaProperties(props);

        factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");


        return factoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory emf) {

        return new JpaTransactionManager(emf);
    }

}
5 respostas

Oi Glener!

Como está estruturada a tabela então, já que ele não cria a tabela Produto_precos?

Boa noite! Na verdade, agora está criando a tabela associativa, só que está criando duas tabelas além de produto, que são produto_preco e produto_precos, porém está inserindo só na tabela produto. Era pra estar criando produto e produto_precos apenas, e inserindo nas duas conforme o exercício do alura.

segue estrutura das tabelas.

MariaDB [casadocodigo]> show tables;;
+------------------------+
| Tables_in_casadocodigo |
 produto                |
| produto_preco          |
| produto_precos         |
+------------------------+
3 rows in set (0.00 sec)

ERROR: No query specified

MariaDB [casadocodigo]> desc produto;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| descricao | varchar(255) | YES  |     | NULL    |                |
| paginas   | int(11)      | NO   |     | NULL    |                |
| titulo    | varchar(255) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

MariaDB [casadocodigo]> desc produto_preco;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| Produto_id | int(11)       | NO   | MUL | NULL    |       |
| tipo       | int(11)       | YES  |     | NULL    |       |
| valor      | decimal(19,2) | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

MariaDB [casadocodigo]> desc produto_precos;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| Produto_id | int(11)       | NO   | MUL | NULL    |       |
| tipo       | int(11)       | YES  |     | NULL    |       |
| valor      | decimal(19,2) | YES  |     | NULL    |       |

Segue erro do servidor

HTTP Status 500 – Internal Server Error
Type Exception Report

Message Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: produto is not mapped [select p from produto p ]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: produto is not mapped [select p from produto p ]
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: produto is not mapped [select p from produto p ]
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:350)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:289)
    com.sun.proxy.$Proxy29.createQuery(Unknown Source)
    br.com.casadocodigo.loja.daos.ProdutoDAO.listar(ProdutoDAO.java:26)
    br.com.casadocodigo.loja.daos.ProdutoDAO$$FastClassBySpringCGLIB$$92ebe7c5.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

Opa Glener! Perdão pela demora

Tenta dar um drop em todas as tabelas do banco e rodar a aplicação de novo? Eu copiei sua classe e tentei reproduzir aqui mas ele acabou criando só as duas:


Como você está fazendo para inserir? O seguinte trecho de código foi o que testei e ele conseguiu salvar os dois [eu estava em uma aplicação de exemplo, desktop mesmo :-)]:

Preco precoDigital = new Preco();
precoDigital.setTipo(TipoPreco.EBOOK);
precoDigital.setValor(new BigDecimal("29.9"));

Preco precoFisico = new Preco();
precoFisico.setTipo(TipoPreco.IMPRESSO);
precoFisico.setValor(new BigDecimal("39.9"));

List<Preco> precos = new ArrayList<>();
precos.add(precoDigital);
precos.add(precoFisico);

Produto produto = new Produto();
produto.setDescricao("Clube da luta");
produto.setPaginas(300);
produto.setDescricao("Muito bom");
produto.setPreco(precos); // associando a lista de precos com o produto

em.persist(produto);

O resultado no banco:

mysql> select * from Produto;
+----+-----------+---------+--------+
| id | descricao | paginas | titulo |
+----+-----------+---------+--------+
|  1 | Muito bom |     300 | NULL   |
+----+-----------+---------+--------+
1 row in set (0.00 sec)

mysql> select * from Produto_precos;
+------------+------+-------+
| Produto_id | tipo | valor |
+------------+------+-------+
|          1 |    0 | 29.90 |
|          1 |    1 | 39.90 |
+------------+------+-------+
2 rows in set (0.00 sec)

mysql> 

Sobre o erro produto is not mapped [select p from produto p ]. acho que vai ter que mudar sua query e colocar "produto" com o "p" maiúsculo:

select p from Produto p

Testa essas coisas e avisa no que deu? Abraço!

solução!

Bom dia! Cara, eu refiz o projeto e copiei e colei dos exercícios e funcionou. Muito obrigado pela atenção

insira seu código aqui