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

Hibernate não cria a tabela usando postgres

Estou usando o postgresql no lugar banco utilizado no curso, o mysql. Tudo estava dando certo, o cadastro e a listagem dos livros funcionando normal, mas ao fazer a parte de inserção dos preços, em que a tabela produto_precos é criada, com o postgres dá o seguinte erro:

Message Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
Root Cause
org.postgresql.util.PSQLException: ERROR: relation "produto_precos" does not exist

Rodando exatamente o mesmo código com o mysql os produtos são cadastrados e a tabela é criada corretamente.

Tem alguma diferença na sintaxe para o hibernate entre o mysql e o postgres?

Segue a classe produto e o produtoDAO

@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;

  <!-- getters and setters-->
}
@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Produto produto){
        manager.persist(produto);
    }
3 respostas

acho que o seu banco está case sensitive... qual foi o nome da tabela que foi gerado? tenta dar uma olhada nisso.. me lembro de já ter passado por esse problema com o postgre. Talvez tenha alguma configuração no peristence.xml que vc possa fazer.

Nem chega a gerar a tabela... mas todas tabelas estavam sendo geradas tudo minúsculo. O erro ocorre quando tenta dar um insert na tabela sendo que ela não foi criada, conforme aparece no console:

Hibernate: insert into Produto (descricao, paginas, titulo) values (?, ?, ?)
Hibernate: insert into Produto_precos (Produto_id, tipo, valor) values (?, ?, ?)
mai 05, 2017 4:36:36 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement] with root cause
org.postgresql.util.PSQLException: ERROR: relation "produto_precos" does not exist

O meu pom.xml está assim

   <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.1.0.RELEASE</version>
</dependency>
<!-- postgres -->
 <dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.1-901-1.jdbc4</version>
</dependency>

E na minha configuração do JPA coloquei estas propriedades

props.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
props.setProperty("hibernate.show_sql", "true");
props.setProperty("hibernate.hbm2ddl.auto", "update");
solução!

Consegui "resolver", eu alterei a linha

props.setProperty("hibernate.hbm2ddl.auto", "update");

para

props.setProperty("hibernate.hbm2ddl.auto", "create");

aí foi criado a tabela que não estava criando. O único ruim é que ao fazer isso todos os dados salvos no banco são excluídos, pois está criando o banco do zero. Como no meu caso não tinha problema, ficou tudo ok