HIBERNATE não cria as tabelas

7 respostas
M

Olá pessoal estava tentando fazer a persistencia somente configurando pelo persistence.xml dentro da pasta META-INF dentro de src, e não configurando hibernate.cfg.xml queria só refrescar a memoria e então segui o tutorial do hebert http://uaihebert.com/?p=27 mas…

Com a classe entidade:

package matheus;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")
public class User{
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@Column
	private String name;
	
	@Column
	private String password;

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result
				+ ((password == null) ? 0 : password.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (password == null) {
			if (other.password != null)
				return false;
		} else if (!password.equals(other.password))
			return false;
		return true;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	
	
}

E o método main:

package matheus;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class main {
	
	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("testeHibernate");
		EntityManager em = emf.createEntityManager();
		
		try {
			em.getTransaction().begin();
			
			User user = new User();
			user.setName("fausto");
			user.setPassword("123");
			
			em.persist(user);
			
			em.getTransaction().commit();
			
			
		} catch (Exception e) {
			em.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			emf.close();
		}
		
		System.out.println("Olha no banco deve ter dado certo.");
	}

}

E simples deveria funcionar, mas além de não criar a tabela no banco, aparece no console o seguinte:

769 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
java.lang.IllegalArgumentException: Unknown entity: matheus.User
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:671)
	at matheus.main.main(main.java:20)
874 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing
874 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost/testeHibernate

7 Respostas

drsmachado

Camarada, por que não lê a mensagem da exception?
Você esqueceu de dizer ao JPA que a classe User é a entidade.

java.lang.IllegalArgumentException: Unknown entity: matheus.User

Isso significa que teu persistemce.xml não contém uma linha com a tag cujo valor seja matheus.User

...
<class>matheus.User</class>
...
M

Nossa velho brigado ja tinha me esquecido que tinha de fazer isso no persistence.xml também, eu fiquei algum tempo utilizando o hibernate.cfg.xml pegando conexão de um context.xml e sabia que deveria configurar a classe entidade no hibernate.cfg.xml e me esqueci de fazer isso no persistence.xml

M

Agora ele parou de lançar a Exception de argumento mas começou dar o erro que não existe a tabela.

193 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Table 'testeHibernate.user' doesn't exist
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert: [matheus.User]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1174)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:674)
	at matheus.main.main(main.java:20)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [matheus.User]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2836)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:668)
	... 1 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'testeHibernate.user' doesn't exist
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 16 more
1197 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing
1197 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost/testeHibernate

mas pela configuração do xml ele deveria estar criando.

K

ja botou essa propriedade no seu persistence.xml ?
<property name="hibernate.hbm2ddl.auto" value="update"/>

drsmachado

kleberdamasco:
ja botou essa propriedade no seu persistence.xml ?
<property name="hibernate.hbm2ddl.auto" value="update"/>

Como o keber disse, essa propriedade te ajudará a resolver o problema.
Porém, precisamos esclarecer o que ela faz.
A função da propriedade hbm2ddl.auto é a de dizer ao hibernate que o mesmo terá de manipular as tabelas no banco de dados.
Os valores que podem ser definidos a esta propriedade são:
create: Criará as tabelas, caso as mesmas não existam. Se existirem, irá executar um drop (apagar as tabelas) e depois criá-las novamente.
create-drop: Criará as tabelas, mas as eliminará como o create.
update: Embora dê a idéia de apenas atualizar (update), este valor fará com que as tabelas que não existem sejam criadas e que as que já existem sejam mantidas.

drsmachado

kleberdamasco:
ja botou essa propriedade no seu persistence.xml ?
<property name="hibernate.hbm2ddl.auto" value="update"/>

Só complementando o kleber.
Você precisa adicionar esta propriedade ou criar a tabela manualmente.
Esta propriedade aceita os valores:
create: independente de como estão as tabelas, ele apaga as que existem (e estão mapeadas no respectivo projeto) e as cria novamente, ou seja, cada vez que o hibernate é executado, você apaga e cria as tabelas.
create-drop: nunca vi funcionar, mas, diz a lenda que ele cria as tabelas e ao fim da execução, as apaga (drop);
update: Cria as tabelas que não existem e não modifica as que existem.

M

è realmente create-drop é uma lenda :\ vlw pessoal

Criado 21 de dezembro de 2012
Ultima resposta 21 de dez. de 2012
Respostas 7
Participantes 3