Hibernate com hibernate.properties e hibernate.cfg.xml

Galera,

como que eu consigo colocar o arquivo hibernate.properties para acessar o banco e o arquivo hibernate.cfg.xml para mapearem as classes… existe alguma configuração específica pos o meu sistema não consegue encontrar as classes mapeadas no hibernate.cfg.xml. Segue o codigo:

hibernate.properties

[code]# Configurações personalizáveis para o Hibernate

Mostrar SQL gerado ?

hibernate.show_sql = false

Exportar o Schema para o BD ?

hibernate.hbm2ddl.auto = update

#Configuracao do cache de segundo nivel
net.sf.ehcache.configurationResourceName=ehcache.xml
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.use_query_cache=true
#que isso sera?
#hibernate.cache.use_structured_entries=true
#hibernate.generate_statistics=true

Connection Pool (acho q nao ta funcionando legal)

#hibernate.c3p0.min_size=1
#hibernate.c3p0.max_size=5
#hibernate.c3p0.timeout=1800
#hibernate.c3p0.max_statements=50

PostgreSQL no XSalada

#hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
#hibernate.connection.driver_class = org.postgresql.Driver
#hibernate.connection.url = jdbc:postgresql://XXX/XXX
#hibernate.connection.username = postgres
#hibernate.connection.password =

MySQL Local

#hibernate.dialect = org.hibernate.dialect.MySQLDialect
#hibernate.connection.driver_class = com.mysql.jdbc.Driver
#hibernate.connection.url = jdbc:mysql://XXX/XXX
#hibernate.connection.username = XXX
#hibernate.connection.password = XXX

PostgreSQL direto

hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.username = postgres
hibernate.connection.password = postgres
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://XXX/XXX

PostgreSQL SEquoia

#hibernate.dialect = br.gov.inca.rhcnet.SequoiaDialect
#hibernate.connection.username = postgres
#hibernate.connection.password =
#hibernate.connection.driver_class = org.continuent.sequoia.driver.Driver
#hibernate.connection.url = jdbc:sequoia://XXX/XXX?connectionPooling=false&preferredController=roundRobin
[/code]

hibernate.cfg.xml

[code]

[/code]

Dao.java

package br.gov.inca.publico.dao;

import java.util.ArrayList;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Criterion;

public class Dao<T> {
	Session session;

	private static Logger log = Logger.getLogger(Dao.class);

	public Dao() throws Exception{
		try{
			log.info("Criando Session Factory...");
			SessionFactory sf = new AnnotationConfiguration().buildSessionFactory();
			log.info("Session Factory Criada!");
			this.session = sf.openSession();
		}catch(Exception e){
			log.fatal(e);
		}
	}
	public void inserirAtualizar(Object obj) throws Exception {
		try{
			Transaction tx = session.beginTransaction();
			session.saveOrUpdate(obj);
			log.info("Inserindo ou atualizando um objeto %s...");
			log.debug(obj);
			tx.commit();
			log.info("Objeto inserido ou atualizado!");
			session.close();
		}catch(Exception e){
			log.fatal(e);
		}
	}
	public ArrayList<T> buscar(Object obj, ArrayList<Criterion> criterios) throws Exception {
		Criteria criteria = session.createCriteria(Object.class);
		log.debug(obj);
		log.info("Buscando objeto %s...");
		for(Criterion criterion : criterios)
			criteria.add(criterion);
		log.debug(obj);
		return (ArrayList<T>)criteria.list();
	}
	public void excluir(Object obj) throws Exception {
		try{
			Transaction tx = session.beginTransaction();
			session.delete(obj);
			log.debug(obj);
			log.info("Excluindo o objeto %s");
			tx.commit();
			log.info("Objeto %s excluído!");
			session.close();
		}catch(Exception e){
			log.fatal(e);
		}
	}
	public Object carregar(Class obj, int value)throws Exception{
		log.info("Carregando o objeto %s");
        return session.load(obj,value);
    }
}

obrigado.

Filipe,

Configura tudo no hibernate.cfg.xml.

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
     <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
        <property name="hibernate.connection.url">jdbc:hsqldb:file:mydvdsDB</property>
        <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>
        <!-- SQL dialect 
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>-->
        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on startup
        tem que deixar essa propriedade ativa apos alguma modificação nas
        tabelas ou no mapeamento, e depois comentar novamente, pois ela apaga
        o que tem na tabela -->
        <property name="hbm2ddl.auto">update</property>
        <mapping class="hiberapp0.Shinigami"/>        
        <mapping class="hiberapp0.Evento"/>
    </session-factory>
</hibernate-configuration>

Adapte o arquivo para o seu sistema.

Se você quer utilizar o arquivo .properties, o mapeamento deve ser feito via código, assim:

Configuration cfg = new Configuration() .addResource("Item1.hbm.xml") .addResource("Item2.hbm.xml");
ou assim:

Configuration cfg = new Configuration() .addClass(Item1.class) .addClass(Item2.class);

é estava deste jeito mas começou a contecer um problema de concorrencia entre as classes a serem persistidas… meio que uma classes estava acessando a outra.

Coloque tudo no arquivo hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">postgres</property>
        <property name="hibernate.connection.url">jdbc:postgresql://192.168.0.26/conprev</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.default_schema">conprev</property>
        <property name="hibernate.dialect"> org.hibernate.dialect.PostgreSQLDialect </property>

     <session-factory>
        <mapping class="br.gov.inca.publico.bean.Instituicao" />
        <mapping class="br.gov.inca.publico.bean.Categoria" />
     </session-factory>
</hibernate-configuration>

Em seguida vamos testar o banco de dados

package br.gov.inca.publico.util;

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

public class GeraBanco {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Configuration conf =  new AnnotationConfiguration();
		conf.configure();
		SchemaExport se =  new SchemaExport(conf);
		se.create(true, true);

	}

}

Classe HibernateUtil para facilitar a instanciação de sessões do Hibernate

package br.gov.inca.publico.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	private static SessionFactory factory;
	
	static {
		Configuration conf = new AnnotationConfiguration();
		conf.configure();		
		factory = conf.buildSessionFactory();
	}
	
	public static Session getSession() {			
		return factory.openSession();
	}

}

Em seguida, vamos ao nosso DAO, não que o seu esteja errado, mas…

package br.gov.inca.publico.dao;

import java.util.List;

import org.hibernate.Transaction;

import org.hibernate.Session;


public class Dao<T>{
	protected final Session session;
	private final Class classe;

	public Dao(Session session, Class classe) {
		this.session = session;		
		this.classe = classe;
	}
	
	protected Session getSession(){
		return this.session;
	}
	
	public void adiciona(T u){
		Transaction t = session.beginTransaction();
		session.save(u);
		t.commit();		
	}


	public List<T> listaTudo() {
		// TODO Auto-generated method stub
		return this.session.createCriteria(this.classe).list();
		
	}
	
	public T procura(Long id) {
		// TODO Auto-generated method stub
		return (T) session.load(this.classe, id);
	}

	public void remove(T u) {
		Transaction t = session.beginTransaction();
		session.delete(u);
		t.commit();
	}

	public void atualiza(T u) {
		// TODO Auto-generated method stub
		Transaction t = session.beginTransaction();
		session.merge(u);
		t.commit();

	}	
	
}

e finalmente o DaoFactory…

package br.gov.inca.publico.dao;;

import org.hibernate.Session;
import org.hibernate.Transaction;
import br.gov.inca.publico.modelo.*;

import br.gov.inca.publico.util.HibernateUtil;

public class DaoFactory {
	private final Session session;

	private Transaction transaction;

	public DaoFactory() {
		session = HibernateUtil.getSession();
	}

	public void beginTransaction() {
		this.transaction = session.beginTransaction();
	}

	public void commit() {
		this.transaction.commit();
		this.transaction = null;
	}

	public boolean hasTransaction() {
		return this.transaction != null;
	}

	public void rollback() {
		this.transaction.rollback();
		this.transaction = null;
	}

	public void close() {
		this.session.close();
	}
	
	public Dao<Instituicao> getInstituicaoDao() {
		return new Dao<Instituicao>(this.session, Instituicao.class);
	}

	public Dao<Categoria> getCategoriaDao() {
		return new Dao<Categoria>(this.session, Categoria.class);
	}	

Configure isto e vamos testar.

Outra coisa, repare onde você está iniciando o SessionFactory, está faltando um método la, o método configure().

SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();

Sua explicação foi BEM genérica, não acha? :?

[quote=jwcunha]

Configure isto e vamos testar.[/quote]

Vc poderia, colocar agora um exemplo de como usar tudo isso??
mesmo levando em conta que nao sabemos como e a classe.

tipo como iniciar a session, chamar o DAO e tal. pode ser?

Bem, isto vai depender de como está o resto da sua aplicação, no meu caso eu utilizo um Interceptador do VRaptor para instanciar meu DaoFactory e ejeto o mesmo - @Out

package com.lmsisman.interceptor;

import org.inca.dao.util.DaoFactory;
import org.vraptor.Interceptor;
import org.vraptor.LogicException;
import org.vraptor.LogicFlow;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;
import org.vraptor.view.ViewException;

/**
 * Interceptador para criar uma fábrica de daos.
 *
 * Componentes que usam esse interceptador (@InterceptedBy(DaoInterceptor.class)
 * vão passar pelo método intercept(...) nessa classe. Eles recebem a fábrica que dá
 * acesso nos daos e banco de dados.
 */
public class DaoInterceptor implements Interceptor {
    
       
    @Out(key = "org.inca.dao.util.DaoFactory")
    private DaoFactory factory; 
    
    public void intercept(LogicFlow flow) throws LogicException, ViewException {
        factory = DaoFactory.getNewDaoFactory();     
        
        try {
            flow.execute();
        } catch (LogicException e) {
            throw e;
        } finally {
            if (factory.hasTransaction()) {
                factory.rollbackTransaction();
            }
            factory.getSession().close();
        }
    }
}

Além disso é preciso adicionar um Listener para inicializar a sessão a partir do contexto da aplicação.

package org.inca.dao.util;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class HibernateListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {        
        or.inca.dao.util.HibernateSessionFactory.getSessionFactory();        
    }

    public void contextDestroyed(ServletContextEvent event) {        
        org.inca..dao.util.HibernateSessionFactory.closeSession();
    }
}

Adicione esta classe ao seu web.xml

<listener>
        <listener-class>org.inca.dao.util.HibernateListener</listener-class>
    </listener>

Depois é só criar sua Lógica de negócios:

public class ElementoComponent {
    private DaoFactory factory;

    public ElementoComponent(DaoFactory factory) {
        this.factory = factory;
    }

    public void create(Elemento e){
        this.factory.getElementoDao().create(e);
    }
}

É isto… parece complexo, e é na verdade, mas só no início, depois vc li-te-ral-men-te nem lembra que tudo isto existe e parte para pensar só na sua lógica de negócio e muito, muito na sua camada de apresentação / visão.

[]'s

Sua explicação foi BEM genérica, não acha? :?[/quote]

COM AFIRMAÇÕES EM TODOS OS TÓPICOS COMO ESTA DÁ PARA VER COMO VC SE TORNOU MODERADOR…

Basta copiar o arquivo hibernate.cfg.xlm para pasta src no eclipse