Hibernate não cria tabela no Banco. [RESOLVIDO]

Estou estudando Hibernate com Annotations pela apostila da Caelum. As classes do exemplo estão abaixo:

A Classe Produto:

public class Produto {

	@Id
	@GeneratedValue
        private Long id;
	private String nome;
	private String descricao;
	private Double preco;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public Double getPreco() {
		return preco;
	}
	public void setPreco(Double preco) {
		this.preco = preco;
	}
	
	
	
}

Meu hibernate.properties:

hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost/teste
hibernate.connection.username = root
hibernate.connection.password = minhaSenha
hibernate.show_sql = true
hibernate.format_sql = true

Minha classe Gera Tabelas:

public class GeraTabelas {
	public static void main(String[] args) {
		// Cria uma configuração para a classe Produto
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Produto.class);
		new SchemaExport(cfg).create(true, false);
	}
}

Porém, quando executo main, não acontece nada. Não mostra nada, nem mensagem de erro e nem cria nenhuma
tabela. Eu copiei os exemplos iguaizinhos aos da apostila da Caelum. Gostaria de saber se alguém pode me dar um help. Grato.

Coloca o @Entity em cima do nome da classe

Ah sim, a classe tem o Entity já, é que eu não colei certo. Mesmo assim não funcionou, continua a mesma coisa:
não acontece absolutamente nada, nem sequer mensagem de erro.

Amigao acho q faltou vc mapear ela no seu hibernate.cfg.xml

exemplo:

<mapping class="br.com.teste.Produto"/>

abraços

Opa Cherubini, tudo beleza?

Cara, eu não tenho o arquivo hibernate.cfg.xml.
Pelo que entendi na apostila, quando usamos Annotations não usamos esse arquivo,
mas criamos uma instância de AnnotedClass, conforme a classe GeraTabela. Pelo que entendi,
o método addAnnotedClass já faz isso.
Na Apostila não tem esse arquivo, só o Hibernate.properties mesmo. Será que é isso?

vc criou o o banco teste?

você tem que ativar a exportação de esquemas DDL para o banco no seu arquivo de propriedades. É só adicionar às propriedades:

Ah, e você também precisa criar o banco antes, como o lgweb falou

1 curtida

modifica isso:


new SchemaExport(cfg).create(true, false);  

coloca assim:


new SchemaExport(cfg).create(true, true);  

esse segundo argumento diz “Crie a tabela” ou mais ou menos isso.

Aí galera, eu fiz os reparos necessários, porém ainda não funcionou. O Banco teste já existe e tal, adicionei a linha que o amigo que tem um avatar de robozinho (foi mal, esqueci seu nick) me disse, mas ainda nao obtive êxito. Quanto a não aparecer nada no console do Eclipse, estava faltando configurar o log4j e adicionar a biblioteca, daí agora eu vejo o que tá acontecendo.

Engraçado que em algumas partes do log aparece algo do tipo:

"exporting Schema to database"
"echoing all SQL code"
"export Schema to database complete"

Parece que vai, mas não vai. Daí eu testei a conexão com o Banco, colocando minha senha errada de propósito no Hibernate.properties, mas deu connection refused. Ou seja, ele conecta ao banco.
Mas vendo os logs, atentei para uma outra coisa:

"Hibernate Validator not found: ignoring"

Será que falta esse carinha? Engraçado que na própria documentação diz que ele não é necessário.
Espero que continuem me ajudando. Grato a todos que me responderam até aqui.

vc fez a alteração que eu postei ? ja passei por isso com o mesmo exercicio e tinha esquecido isso. pelo seu codigo esse é o problema .

Oi egamorim , pior que eu fiz viu. Já tô começando a pensar que pode ser pau de import. Eu estou só com o hibernate-core e o hibernate-annotations. Só eles dois são o suficiente?

Ops, comando errado. Era pra ser:

my bad :roll:

Como as coisas ficaram:

Meu hibernate.properties:

hibernate.dialect = org.hibernate.dialect.MySQLDialect  
hibernate.connection.driver_class = com.mysql.jdbc.Driver  
hibernate.connection.url = jdbc:mysql://localhost/teste  
hibernate.connection.username = root  
hibernate.connection.password = minhaSenha  
hibernate.show_sql = true  
hibernate.format_sql = true  
hibernate.hbm2ddl.auto = create  

Minha Classe Produtos:

@Entity
public class Produto {  

@Id  
@GeneratedValue  
private Long id;  
private String nome;  
private String descricao;  
private Double preco;  
public Long getId() {  
return id;  
}  
public void setId(Long id) {  
this.id = id;  
}  
public String getNome() {  
return nome;  
}  
public void setNome(String nome) {  
this.nome = nome;  
}  
public String getDescricao() {  
return descricao;  
}  
public void setDescricao(String descricao) {  
this.descricao = descricao;  
}  
public Double getPreco() {  
return preco;  
}  
public void setPreco(Double preco) {  
this.preco = preco;  
}  

}  

Minha classe GeraTabelas:

public class GeraTabelas {  
    public static void main(String[] args) {  
         // Cria uma configuração para a classe Produto  
        AnnotationConfiguration cfg = new AnnotationConfiguration();  
       cfg.addAnnotatedClass(Produto.class);  
       new SchemaExport(cfg).create(true, true);  
     }  
}  

Acho que no código tá tudo certo. Talvez o problema seja o alinhamento de Saturno com Plutão, ou uma parte do Cosmos que explodiu e se perdeu em camadas dispersas de tempo contíguo.
Eu realmente não sei o que está acontecendo. Só sei que a IDE continua a rir de mim, rsrs Quais os imports que vocês usam?

Nao sei se tem a ver mas tente colocar a anotacao @Table e implemente Serializable


   @Entity  
@Table(name="produto")
   public class Produto implements Serializable{         
   @Id    
   @GeneratedValue    
   private Long id;    
   private String nome;    
   private String descricao;    
   private Double preco;    
   public Long getId() {    
   return id;    
   }    
   public void setId(Long id) {    
   this.id = id;    
   }    
   public String getNome() {    
   return nome;    
   }    
   public void setNome(String nome) {    
   this.nome = nome;    
   }    
   public String getDescricao() {    
   return descricao;    
   }    
   public void setDescricao(String descricao) {    
   this.descricao = descricao;    
   }    
   public Double getPreco() {    
   return preco;    
   }    
   public void setPreco(Double preco) {    
   this.preco = preco;    
   }    
     
   }    

Vou tentar fazer isso lgweb . Eu só fiquei com uma dúvida relacionada aos imports:

  • Na pasta hibernate-distribution/lib tem uma pasta chamada required. Pela Documentação o Hibernate deve ter os arquivos dessa pra funcionar.
    Lá tem um arquivo chamado sl4j-api.jar. E na pasta raíz do hibernate (hibernate-distribution) tem o arquivo hibernate3. Ok.

  • Já na pasta hibernate-annotations/lib tem um monte de arquivo tbm, inclusive um repeteco do sl4j-api.jar e mais um hibernate-core.jar.

Dúvida: O que é repetido e o que não é? O que eu devo realmente adicionar?

Consegui Resolver o problema! Eu vi como o NetBeans organizava as bibliotecas pra poder montar igual no Eclipse. Além disso, precisei fazer umas pequenas alterações no meu projeto:

  • Primeiro:
    Estava colocando tudo na pasta src, mas mudei. Dentro da pasta src criei um novo pacote, que contém as minhas classes. Na pasta src ficou o hibernate.properties

  • Segundo:
    Na classes Produto, estava anotando assim: "@hibernate.annotations.Entity"
    Troquei para a anotação: “@javax.persistence.Entity

  • Terceiro:
    Acho que eu havia falado algo sobre ter dúvida dos arquivos slf4j.jar, que vem tanto no hibernate como no hibernate-annotations. Eu não os adicionei de nenhuma dessas pastas. Eu tive a impressão de eles estarem dando conflito. Então baixei o slf4j e lá tem tudo atualizado pra mim. Os jars ficaram organizados assim:

Da pasta hibernate-annotations/lib:
dom4j.jar
ejb3-persistence.jar
hibernate-commons-annotations.jar
hibernate-core.jar


Da Pasta hibernate-distribution:
hibernate3.jar


Da Pasta hibernate-distribution/lib/required:
antlr-2.7.6
commons-collections-3.1
dom4j-1.6.1.jar
javassist-3.9.0.GA
jta-1.1


Da Pasta hibernate-distribution/lib/optional/ehcache:
ehcache.jar

hibernate-distribution/lib/bytecode/cglib:
cglib.jar

Da pasta hibernate-entity-manager:
hibernate-entity-manager.jar

Da pasta hibernate-entity-manager/lib:
hibernate-annotations.jar


Da pasta slf4j-1.5.8:
slf4j-api-1.5.8.jar
slf4j-simple-1.5.8.jar
log4j-over-slf4-1.5.8.jar

Além, claro, do mysql-connector

O resto ficou como antes mesmo. Obrigado a todo mundo que me ajudou até aqui. Sou grato a todos.

A classe Produto:

package hibernatefurnunciando;

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

@Entity
public class Produto {
	
	@Id
	@GeneratedValue
	private Long id;
    private String nome;
    private String descricao;
	private Double preco;

	public Long getId() {
		return id;
	}

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

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Double getPreco() {
		return preco;
	}

	public void setPreco(Double preco) {
		this.preco = preco;
	}

}

A classe GeraTabela:

package hibernatefurnunciando;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class GeraTabela {

	public static void main(String[] a){
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Produto.class);
		new SchemaExport(cfg).create(true, true);
	}
	
}

Meu hibernate.properties:

hibernate.dialect org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://localhost/teste
hibernate.connection.username root
hibernate.connection.password minhaSenha
hibernate.show_sql true
hibernate.format_sql true

Abaixo tem uma imagem do Projeto rodando, mas do lado esquerdo dá pra ver os jars que eu importei:


Boa tarde Galera,

Estou com o mesmo problema, estou utilizando o banco de dados Derby (em memória), e ao que me parece o hibernate não está conseguindo gerar a minha estrutura de banco de dados, que é composta por (schema.tabela), sendo que possuo diversos Schemas em todo o Banco de dados. No Sistema Utilizamos o Postgresql, porém estamos adotando a técnica do TDD (Test Driven Development), e para agilizar este processo optamos por utilizar um banco em memória (HSQLDB ou DERBY). Porém não estamos conseguindo da continuidade, devido a esse problema, vou postar a excessão gerada.
Se alguém souber ou puder ajudar, agradeço. :smiley:

Excessão Gerada :

[quote] Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [br.fpf.laboratorio.entitybean.TipoAmostra]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:213)
… 30 more
Caused by: java.sql.SQLSyntaxErrorException: O esquema ‘LABORATORIO’ não existe
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.(Unknown Source)
at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:30) [/quote]

Muito Obrigado.

Eu estava com o mesmo problema, porém eu resolvi de forma mais simples:

Nesta linha:

Eu coloquei :

Acrescentando o 5 após o MySQL, aqui funcionou perfeitamente.

[quote=gesielRodrigues]Eu estava com o mesmo problema, porém eu resolvi de forma mais simples:

Nesta linha:

Eu coloquei :

Acrescentando o 5 após o MySQL, aqui funcionou perfeitamente.[/quote]

Eu estava com o mesmo problema. Que coisa mais maluca, mas adicionando só o 5 depois do MySQL resolveu tudo aqui tbm ‘-’ hauahu valeu.