Galera,
Gostaria de esclarecer uma dúvida em relação ao hibernate, estou seguindo os exemplos da caelum (o pai nosso do java).
Com muito luta em relação as biliotecas do hibernate, consegui fazer funcionar.
Segue meus códigos, em seguida escrevo a dúvida.
arquivo HibernateUtil
package geral;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.Session;
public class HibernateUtil {
private static SessionFactory factory;
static {
AnnotationConfiguration cfg = new AnnotationConfiguration();
factory = cfg.buildSessionFactory();
}
public Session getSession() {
return factory.openSession();
}
}
Arquivo geraTabelas
package geral;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
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);
SchemaExport se = new SchemaExport(cfg);
se.create(true,true);
}
}
Arquivo Produto
package geral;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Produto {
@Id
@GeneratedValue
private int id;
private String nome;
private double preco;
private Calendar dataInicioVenda;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
public Calendar getDataInicioVenda() {
return dataInicioVenda;
}
public void setDataInicioVenda(Calendar dataInicioVenda) {
this.dataInicioVenda = dataInicioVenda;
}
}
arquivo ProdutoDAO
package dao;
import geral.Produto;
import org.hibernate.Session;
public class ProdutoDAO {
private Session session;
public ProdutoDAO (Session session) {
this.session = session;
}
public void salva (Produto p) {
this.session.save(p);
}
public void remove (Produto p) {
this.session.delete(p);
this.session.flush();
}
public Produto procura (Long id) {
return (Produto) this.session.load(Produto.class, id);
}
public void atualiza (Produto p) {
this.session.update(p);
this.session.flush();
}
/* comentei aqui, pois vou testar posteriormente
public List<Produto> listaTudo() {
return this.session.createCriteria(Produto.class).list();
}
public List<Produto> pagina (int inicio, int quantia) {
return this.session.createCriteria(Produto.class)
.setMaxResults(quantia).setFirstResult(inicio).list();
}
public List<Produto> precoMaiorQue(double preco) {
Query query = this.session.createQuery("from Produto where preco > :preco");
query.setDouble("preco", preco);
return query.list();
}
*/
}
Arquivo hibernate.properties
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost/fj21
hibernate.connection.username = root
hibernate.connection.password =
hibernate.show_sql = true
hibernate.format_sql = true
Arquivo AdicionaProduto
package geral;
import java.util.GregorianCalendar;
import org.hibernate.Session;
import geral.Produto;
public class AdicionaProduto {
public static void main(String[] args) {
Produto p = new Produto();
p.setNome("Produto1");
p.setDataInicioVenda(new GregorianCalendar(2009, 1, 26));
p.setPreco(100.50);
Session session = new HibernateUtil().getSession();
session.save(p);
System.out.println("ID do produto: " + p.getId());
session.close();
}
}
Arquivo Produto.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="hibernate.geral.Produto" table="produto">
<id name="id" column="id">
<generator class="assigned"/>
</id>
<property name="dataInicioVenda" column="dataInicioVenda"/>
<property name="nome" column="nome"/>
<property name="preco" column="preco"/>
</class>
</hibernate-mapping>
mensagem do console:
0 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.4.0.GA
31 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.3.0.SP1
47 [main] INFO org.hibernate.cfg.Environment - loaded properties from resource hibernate.properties: {hibernate.connection.username=root, hibernate.connection.password=****, hibernate.dialect=org.hibernate.dialect.MySQLDialect, hibernate.show_sql=true, hibernate.connection.url=jdbc:mysql://localhost/fj21, hibernate.bytecode.use_reflection_optimizer=false, hibernate.connection.driver_class=com.mysql.jdbc.Driver, hibernate.format_sql=true}
47 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
63 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
203 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.1.0.GA
219 [main] DEBUG org.hibernate.cfg.AnnotationConfiguration - Validator not present in classpath, ignoring event listener registration
219 [main] DEBUG org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Search not present in classpath, ignoring event listener registration.
219 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
219 [main] DEBUG org.hibernate.cfg.Configuration - Preparing to build session factory with filters : {}
219 [main] DEBUG org.hibernate.cfg.AnnotationConfiguration - Execute first pass mapping processing
313 [main] DEBUG org.hibernate.cfg.AnnotationConfiguration - Process hbm files
313 [main] DEBUG org.hibernate.cfg.AnnotationConfiguration - Process annotated classes
313 [main] DEBUG org.hibernate.cfg.AnnotationConfiguration - processing fk mappings (*ToOne and JoinedSubclass)
313 [main] DEBUG org.hibernate.cfg.Configuration - processing extends queue
313 [main] DEBUG org.hibernate.cfg.Configuration - processing collection mappings
313 [main] DEBUG org.hibernate.cfg.Configuration - processing native query and ResultSetMapping mappings
313 [main] DEBUG org.hibernate.cfg.Configuration - processing association property references
313 [main] DEBUG org.hibernate.cfg.Configuration - processing foreign key constraints
313 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring
313 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
313 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20
313 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
344 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/fj21
344 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=root, password=}
344 [main] DEBUG org.hibernate.connection.DriverManagerConnectionProvider - opening new JDBC connection
922 [main] DEBUG org.hibernate.connection.DriverManagerConnectionProvider - created connection to: jdbc:mysql://localhost/fj21, Isolation Level: 4
922 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: MySQL, version: 5.1.41
922 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.7 ( Revision: ${svn.Revision} )
953 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.MySQLDialect
1047 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
1047 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch size: 15
1047 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch updates for versioned data: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
1047 [main] DEBUG org.hibernate.cfg.SettingsFactory - Wrap result sets: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): enabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Maximum outer join fetch depth: 2
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
1047 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
1047 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
1047 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
1063 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
1156 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
1156 [main] DEBUG org.hibernate.impl.SessionFactoryImpl - Session factory constructed with filter configurations : {}
1156 [main] DEBUG org.hibernate.impl.SessionFactoryImpl - instantiating session factory with properties: {java.runtime.name=Java(TM) SE Runtime Environment, hibernate.connection.password=, sun.boot.library.path=C:\Arquivos de programas\Java\jre6\bin, java.vm.version=14.3-b01, hibernate.connection.username=root, java.vm.vendor=Sun Microsystems Inc., java.vendor.url=http://java.sun.com/, path.separator=;, java.vm.name=Java HotSpot(TM) Client VM, file.encoding.pkg=sun.io, user.country=BR, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=Service Pack 3, java.vm.specification.name=Java Virtual Machine Specification, user.dir=C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate, java.runtime.version=1.6.0_17-b04, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=C:\Arquivos de programas\Java\jre6\lib\endorsed, os.arch=x86, java.io.tmpdir=C:\DOCUME~1\F06003~1\CONFIG~1\Temp\, line.separator=
, java.vm.specification.vendor=Sun Microsystems Inc., user.variant=, os.name=Windows XP, sun.jnu.encoding=Cp1252, java.library.path=C:\Arquivos de programas\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre6/bin/client;C:/Arquivos de programas/Java/jre6/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\system32\WindowsPowerShell\v1.0, java.specification.name=Java Platform API Specification, java.class.version=50.0, sun.management.compiler=HotSpot Client Compiler, os.version=5.1, user.home=C:\Documents and Settings\F06003380, user.timezone=GMT-03:00, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=Cp1252, java.specification.version=1.6, hibernate.format_sql=true, hibernate.connection.driver_class=com.mysql.jdbc.Driver, user.name=F06003380, java.class.path=C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\bin;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\ant-contrib-1.0b2.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\ant-junit-1.6.5.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\antlr-2.7.6.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\antlr.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\asm-attrs.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\asm.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\c3p0-0.9.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\cglib-2.2.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\commons-collections-3.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\commons-collections.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\dom4j-1.6.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\dom4j.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\ehcache-1.2.3.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\ejb3-persistence.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\hibernate-annotations.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\hibernate-commons-annotations.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\hibernate-core.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\hibernate3.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\javassist-3.9.0.GA.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\javassist.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\jboss-cache-1.4.1.GA.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\jbosscache-core-3.1.0.GA.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\jta-1.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\jta.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\junit-3.8.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\junit.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\log4j.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\mysql-connector-java-5.1.7-bin.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\oscache-2.1.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\proxool-0.8.3.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\slf4j-api-1.5.8.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\slf4j-api.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\slf4j-log4j12.jar;C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\wtpwebapps\ROOT\hibernate\lib\swarmcache-1.0RC2.jar, hibernate.bytecode.use_reflection_optimizer=false, hibernate.show_sql=true, java.vm.specification.version=1.0, sun.arch.data.model=32, java.home=C:\Arquivos de programas\Java\jre6, hibernate.connection.url=jdbc:mysql://localhost/fj21, hibernate.dialect=org.hibernate.dialect.MySQLDialect, java.specification.vendor=Sun Microsystems Inc., user.language=pt, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, java.version=1.6.0_17, java.ext.dirs=C:\Arquivos de programas\Java\jre6\lib\ext;C:\WINDOWS\Sun\Java\lib\ext, sun.boot.class.path=C:\Arquivos de programas\Java\jre6\lib\resources.jar;C:\Arquivos de programas\Java\jre6\lib\rt.jar;C:\Arquivos de programas\Java\jre6\lib\sunrsasign.jar;C:\Arquivos de programas\Java\jre6\lib\jsse.jar;C:\Arquivos de programas\Java\jre6\lib\jce.jar;C:\Arquivos de programas\Java\jre6\lib\charsets.jar;C:\Arquivos de programas\Java\jre6\classes, java.vendor=Sun Microsystems Inc., file.separator=\, java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi, sun.cpu.endian=little, sun.io.unicode.encoding=UnicodeLittle, sun.desktop=windows, sun.cpu.isalist=}
1156 [main] DEBUG org.hibernate.impl.SessionFactoryObjectFactory - initializing class SessionFactoryObjectFactory
1172 [main] DEBUG org.hibernate.impl.SessionFactoryObjectFactory - registered: 8a8383df278b373901278b3739ff0000 (unnamed)
1172 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
1172 [main] DEBUG org.hibernate.impl.SessionFactoryImpl - instantiated session factory
1172 [main] DEBUG org.hibernate.impl.SessionFactoryImpl - Checking 0 named HQL queries
1172 [main] DEBUG org.hibernate.impl.SessionFactoryImpl - Checking 0 named SQL queries
1313 [main] DEBUG org.hibernate.impl.SessionImpl - opened session at timestamp: 12693510046
Exception in thread "main" org.hibernate.MappingException: Unknown entity: geral.Produto
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:580)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1365)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546)
at geral.AdicionaProduto.main(AdicionaProduto.java:15)
Consegui fazer o hibernate gerar a tabela atraves da aplicação java.
Porem conforme vocês podem ver, ele não encotra a classe Produto, tentei criar o arquivo Produto.hbm.xml, porém na apostila nem cita ele (talvez ele vem no exemplo que tem zipado, porém nao achei estes exemplos no site da caelum).
Conforme pesquisei em alguns tópicos, estou usando anotações, correto?
qual seria o melhor procedimento, ter um arquivo hibernate.hbm.xml mapeando todas classes, ou separa cada hbm.xml conforme classe?
Enfim, minha dúvida maior é fazer este adicionaProduto funcionar