Erro ao criar tabelas no Hibernate

8 respostas Resolvido
javahibernateerror
W

Bom dia pessoal esse é meu primeiro poste aqui, estou tendo dificuldades em criar uma tabela e acessar ela no meu banco de dados, porem o Hibernate faz conexão normal com o banco. Segue meus códigos.
Se alguém pude-se me ajudar eu agradeceria muito. Obrigado pela atenção de todos.

Minha classe de contato, minha entidade.

package br.com.crudannotations;

import java.sql.Date;
import javax.persistence.*;

@Entity
@Table(name = "contato")
public class Contato{

@Id
@GeneratedValue
@Column(name = "codigo")
private Integer	codigo;

@Column(name = "nome", length = 50, nullable = true)
private String	nome;

@Column(name = "telefone", length = 50, nullable = true)
private String	telefone;

@Column(name = "email", length = 50, nullable = true)
private String	email;

@Column(name = "dt_cad", nullable = true)
private Date		dataCadastro;

@Column(name = "obs", nullable = true)
private String	observacao;

public Integer getCodigo() {
	return codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public String getNome() {
	return nome;
}

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

public String getTelefone() {
	return telefone;
}

public void setTelefone(String telefone) {
	this.telefone = telefone;
}

public String getEmail() {
	return email;
}

public void setEmail(String email) {
	this.email = email;
}

public Date getDataCadastro() {
	return dataCadastro;
}

public void setDataCadastro(Date dataCadastro) {
	this.dataCadastro = dataCadastro;
}

public String getObservacao() {
	return observacao;
}

public void setObservacao(String observacao) {
	this.observacao = observacao;
}

}

Minha classe de crud e meu teste de inserção no banco

package br.com.crudannotations;

import java.sql.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.hibernate.conexao.HibernateUtil;

public class ContatoCrudAnnotations {

private Session sessao;

public ContatoCrudAnnotations(Session sessao) {
	this.sessao = sessao;
}

public void salvar(Contato contato) {
	sessao.save(contato); 
}

public void atualizar(Contato contato) {
	sessao.update(contato); 
}

public void excluir(Contato contato) {
	sessao.delete(contato); 
}

public List<Contato> listar() { 
	Query consulta = sessao.createQuery("from Contato");
	return consulta.list();
}

public Contato buscaContato(int valor) {
	Query consulta = sessao.createQuery("from Contato where codigo = :parametro"); 
	consulta.setInteger("parametro", valor); 
	return (Contato) consulta.uniqueResult(); 
}

public static void main(String[] args) {
	
	Session sessao = HibernateUtil.getSessionFactory().openSession();
	Transaction transacao = sessao.beginTransaction(); 
	ContatoCrudAnnotations contatoCrud = new ContatoCrudAnnotations(sessao);
	
	Contato contato1 = new Contato();
	contato1.setNome("wallyson");
	contato1.setTelefone("[telefone removido]");
	contato1.setEmail("[email removido]");
	contato1.setDataCadastro(new Date(System.currentTimeMillis()));
	contato1.setObservacao("Primeiro cliente teste");
	contatoCrud.salvar(contato1);
	contato1.setObservacao("Cliente teste 1");
	contatoCrud.atualizar(contato1);
	
	Contato contato2 = new Contato();
	contato2.setNome("Gabriele");
	contato2.setTelefone("[telefone removido]");
	contato2.setEmail("[email removido]");
	contato2.setDataCadastro(new Date(System.currentTimeMillis()));
	contato2.setObservacao("Segundo cliente teste");
	contatoCrud.salvar(contato2);
	
	System.out.println("Total de registros cadastrados: "+contatoCrud.listar().size());
	contatoCrud.excluir(contato1);
	
	transacao.commit();
	System.out.println("Total de registros cadastrados: "+contatoCrud.listar().size());
}
}

Meu arquivo hibernate.cfg.xml

<hibernate-configuration>


	<session-factory>

	<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="connection.url">jdbc:mysql://localhost/agenda</property>
	<property name="connection.username">root</property>
	<property name="connection.password">root</property>
	<property name="current_session_context_class">thread</property>

	<property name="c3po.min_size">5</property>
	<property name="c3po.max_size">20</property>
	<property name="c3po.timeout">300</property>
	<property name="c3po.max_statements">50</property>
	<property name="c3po.idle_test_period">3000</property>

	<property name="show_sql">true</property>
	<property name="format_sql">true</property>
	<property name="generate_statistics">true</property>
	<property name="use_sql_comments">true</property>
	
	<mapping class="br.com.crudannotations.Contato"/>
    </session-factory>
</hibernate-configuration>

Meu log de erro

ago 01, 2016 9:29:43 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager 

INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}

ago 01, 2016 9:29:43 AM org.hibernate.Version logVersion

INFO: HHH000412: Hibernate Core {4.3.4.Final}

ago 01, 2016 9:29:43 AM org.hibernate.cfg.Environment 

INFO: HHH000206: hibernate.properties not found

ago 01, 2016 9:29:43 AM org.hibernate.cfg.Environment buildBytecodeProvider

INFO: HHH000021: Bytecode provider name : javassist

ago 01, 2016 9:29:44 AM org.hibernate.cfg.Configuration configure

INFO: HHH000043: Configuring from resource: hibernate.cfg.xml

ago 01, 2016 9:29:44 AM org.hibernate.cfg.Configuration getConfigurationInputStream

INFO: HHH000040: Configuration resource: hibernate.cfg.xml

ago 01, 2016 9:29:44 AM org.hibernate.cfg.Configuration doConfigure

INFO: HHH000041: Configured SessionFactory: null

ago 01, 2016 9:29:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)

ago 01, 2016 9:29:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/agenda]

ago 01, 2016 9:29:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH000046: Connection properties: {user=root, password=***<em>}

ago 01, 2016 9:29:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH000006: Autocommit mode: false

ago 01, 2016 9:29:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

INFO: HHH000115: Hibernate connection pool size: 20 (min=1)

ago 01, 2016 9:29:44 AM org.hibernate.dialect.Dialect 

INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect

ago 01, 2016 9:29:44 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService

INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)

ago 01, 2016 9:29:44 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory 

INFO: HHH000397: Using ASTQueryTranslatorFactory

Hibernate:

/</em> insert br.com.crudannotations.Contato

*/ insert

into

contato

(dt_cad, email, nome, obs, telefone)

values

(?, ?, ?, ?, ?)

ago 01, 2016 9:29:45 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

WARN: SQL Error: 1146, SQLState: 42S02

ago 01, 2016 9:29:45 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

ERROR: Table agenda.contato doesnt exist

Exception in thread main org.hibernate.exception.SQLGrammarException: could not execute statement

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)

at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)

at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)

at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:97)

at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:488)

at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:193)

at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:177)

at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:212)

at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324)

at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)

at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)

at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)

at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)

at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)

at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)

at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)

at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)

at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)

at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)

at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)

at br.com.crudannotations.ContatoCrudAnnotations.salvar(ContatoCrudAnnotations.java:21)

at br.com.crudannotations.ContatoCrudAnnotations.main(ContatoCrudAnnotations.java:55)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table agenda.contato doesnt exist

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance(Unknown Source)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)

at com.mysql.jdbc.Util.getInstance(Util.java:384)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)

 23 more

8 Respostas

I

Mas porque ele está criando pra vc ?
Sabe que ele fica criando varchar de 255 para os campos, e nem sempre é isso o desejado.
Gere vc mesmo o sql

S

mas ele pode definir a quantidade de caracteres dentro da annotation usando o length = 50
@Column(name = “nome”, length = 50, nullable = true)
conforme ele está definindo.

não sei se estou certo, mas sempre me orientaram gerar as tabelas do banco de forma automática pelo hibernate, tendo como vantagem uma melhor aderência e padronização do projeto com o banco de dados.

oque pode ser feito através da engenharia reversa também.

J

Só está procurando problema e perdendo tempo dessa forma, geralmente se faz isso por purismo. Melhor criar diretamente as tabelas no banco.

I

Sim @Sandro_Machado ele criaria nesse caso um varchar2 de 50.
Mas caso não colocasse seria um varchar de 255, para um tipo BigDecimal seria um number (19,2) .
E as vezes esses valores não seriam apropriados.

Particularmente, eu prefiro definir isso direto no sql, mas cada um cada um.

S

poise @igomes, tudo depende, as vezes perco tanto tempo configurando as annotations que me pergunto porque não fiz direto no sql kkkkk mas enfim.

S
Solucao aceita

bom voltando ao problema do colega @wallyson2712, no log vemos que está dizendo que a tabela ‘agenda.contato’ não existe, então deves ver o porque não está criando a tabela em questão.

eu configuro o hibernate pelo persistence.xml não tenho muito conhecimento no session.

mas creio não mudar muito então.

você não teria de ter uma linha no cfg assim:
<property name="hbm2ddl.auto">update</property>

indicando a estratégia de geração e atualização das tabelas.

outra coisa vi que você utilizou a annotation @GeneratedValue

mas se não me engano ela exige um par de atributos como o abaixo

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_Contato")
@SequenceGenerator(name = "seq_Contato", sequenceName = "s_Contato")

verifique isto e poste os resultados.

W

Caraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa só não te dou um abraço por que você tá longe. Muito obrigado, como nosso amigo Sandro falou, estava realmente faltando “update”, eu não sabia que deveria colocar essa linha. Muito Obrigado mesmo, resolveu o problema, criou a tabela e os dados na tabela. Obrigado pelo comentários de todos e a ajuda viu. Valeuuu \o/

S

disponha amigo, mas tome cuidado com essa linha

pois ela apaga as tabelas e recria, não leve ela para a versao final

Criado 1 de agosto de 2016
Ultima resposta 2 de ago. de 2016
Respostas 8
Participantes 4