Criando tabelas com Hibernate 3.5.6-Final e JPA

E ae galera blz ?

Seguinte, estou tentando passar uma aplicação que usa JDBC(Oracle) para Hibernate + JPA, eu criei uma pasta chamada META-INF dentro do src/ e dentro desta pasta META-INF eu criei o meu persistence.xml.

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="inventario" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<class>edu.fatec.zl.bean.Editora</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
			<property name="hibernate.hbm2dll.auto" value="create"/>
			<property name="hibernate.connection.url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
			<property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" />
            <property name="hibernate.connection.password" value="***************" />
            <property name="hibernate.connection.username" value="system" />
            <property name="hibernate.show_sql" value="true"/>
		</properties>
	</persistence-unit>
</persistence>

Quando eu subo o Tomcat v7 ele não faz o create table através do Hibernate e não mostra nada na console a respeito de log… Eu coloquei o log4j na pasta lib e coloquei um arquivo log4j.properties na pasta src/. Eu também estou tentando executar o create do Hibernate através de uma classe com um método main, mas ele não cria e ainda o SLF4J me avisa que não existe implementação do log…

Segue abaixo mais detalhes:
log4j.properties

log4j.rootCategory=INFO,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%r [%t] %-5p %c - %m%n

log4j.logger.org.hibernate=warn,info,error

TesteDao

package edu.fatec.zl.dao;

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

import edu.fatec.zl.bean.Editora;

public class TesteDao {

	public static void main(String[] args) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("inventario");
		EntityManager manager = factory.createEntityManager();
		Editora editora = new Editora();
		editora.setName("Ivan");
		editora.setValue("12345");
		manager.persist(editora);
		
		factory.close();
	}
}

StackTrace quando eu executo a classe acima, pelo que eu entendi é que não foi criada a tabela logo não tem sequence…

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not get next sequence value
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
	at edu.fatec.zl.dao.TesteDao.main(TesteDao.java:17)
Caused by: org.hibernate.exception.SQLGrammarException: could not get next sequence value
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:132)
	at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:105)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
	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:808)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672)
	... 1 more

Agradeço desde já a ajuda de todos.

Ná propriedade “hibernate.hbm2dll.auto” tenta por esta propriedade : “hibernate hbm2ddl.auto” e na propriedade value coloque update. Acredito que seja isso.
flw.

Coloquei update e também não funcionou…

Neste http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html vc encontra a descrição de algumas propriedades dos atributos do xml do persistence.xml e hibernate

Vc alterou a propriedade hibernate.hbm2dll.auto para hibernate.hbm2ddl.auto

silasjr, funcionou, muito obrigado!!!
Por isso que o java é forte, tem comunidade!!!

Um erro tão besta que eu acho que nunca iria perceber!

Vlw pessoal!

De nada ivandasilva !!!
Qualquer coisa a comunidade está aqui para ajudar mesmo.
flw

Alguém sabe porque ele não cria as tabelas quando eu inicio o Tomcat, ele cria apenas pelo método main…

Obrigado!

Onde vc está instanciando o objeto EntityManager?

Eu acho que com essa pergunta já obtive uma resposta, eu pensava que o persistence.xml seria lido e as tabelas seriam criadas automaticamente, vou criar o EntityManager e coloca-lo na sessão, acredito que seja isto, certo ?

E quanto aos logs do log4j ?

Eu mudei o arquivo src/log4j.properties
log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=debug
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

Se vc estiver utilizando servlet. Acho que o melhor seria vc criar primeiramente uma Factory para gerar seu objeto do tipo EntityManager. Após vc criaria um Filter que seria executado ao inicar a aplicação, ou seja quando o tomcat for iniciado e também para qualquer URL da sua aplicação.

Hibernate/JPA neste link tem todos os passos e exemplos para fazer o que eu descrevi pois acredito que seja a melhor prática. Pois se vc colocar o objeto na sessão vc poderá enfretar o problema de pegar um objeto que estaja com a conexão fechada e outros problemas que poderão acontecer.

silasjr

Valeu pela dica mais uma vez !!!