Hibernate DAO gerado pelo hibernate tools & SessionFactory instanciada pelo Spring

1 resposta
R

Opa Galera, tenho uma dúvida.

O hibernate Tools, plugin do eclipse, tem a opção de exportar classes DAO para tornar mais fácil fazer a persistencia com o bd... ele cria uma classe +- assim..

public class PacoteViagemItemHome {

	private static final Log log = LogFactory
			.getLog(PacoteViagemItemHome.class);

	private final SessionFactory sessionFactory = getSessionFactory();

	protected SessionFactory getSessionFactory() {
		try {
			return (SessionFactory) new InitialContext()
					.lookup("SessionFactory");
		} catch (Exception e) {
			log.error("Could not locate SessionFactory in JNDI", e);
			throw new IllegalStateException(
					"Could not locate SessionFactory in JNDI");
		}
	}

	public void persist(PacoteViagemItem transientInstance) {
		log.debug("persisting PacoteViagemItem instance");
		try {
			sessionFactory.getCurrentSession().persist(transientInstance);
			log.debug("persist successful");
		} catch (RuntimeException re) {
			log.error("persist failed", re);
			throw re;
		}
	}

........ mais métodos.......

}

Nesta classe ele gera aquele método, getSessionFactory para recuperar o sessionFactory do hibernate.
No meu caso o Hibernate é integrado com o Spring, portanto quem cria a SessionFactory é o Spring, deixando ele como um bean na aplicação.
Segue abaixo a criação do bean:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
	    <property name="driverClassName" value="org.postgresql.Driver" />
	    <property name="url" value="jdbc:postgresql://localhost:5432/database" />
	    <property name="username" value="user" />
	    <property name="password" value="senha" />
	</bean>
	
	<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	    <property name="dataSource" ref="myDataSource"/>

		<property name="mappingResources">
	    <list>
	      <value>../hibernate/cadastro/parametrizacao/Orgao001Param.hbm.xml</value>
				<value>../hibernate/cadastro/pais/Pais.hbm.xml</value>

				.............. meus POJOS .....

				<value>../hibernate/cadastro/titulo/TituloPagarParcela.hbm.xml</value>
	    </list>
   	</property>
		
	    <property name="hibernateProperties">
	    	<value>hibernate.cfg.xml</value>
	    </property>
	</bean>

E para usalo em uma classe eu faço um wire no spring:

<bean id="enderecamentoBean" class="br.com.dsystems.beans.DSBeanEnderecamento" scope="request">
    	<property name="factory" ref="mySessionFactory" />
    </bean>

E acesso criando uma variavel na minha classe:

private SessionFactory factory;
public void setFactory(SessionFactory factory) { this.factory = factory; }
public SessionFactory getFactory() { return this.factory; }

O método getSessionFactory retorna esta mesma factory que eu criei no Spring ? Não né ?
Se não for, como eu faço para recuperar aquela que o spring criou ?

Obrigado
Rodrigo Kerkhoff

1 Resposta

R

Bom, antes tarde que nunca.

Eu tive esse mesmo problema, e fica aqui para os que vierem

Para resolver este problema, você tem que fazer o hibernate.cfg.xml não usar o JNDI, para isso você adiciona no hibernate.cfg.xml, a seguinte linha.

<property name=“hibernate.current_session_context_class”>thread</property>

Espero que ajude.

Criado 2 de junho de 2008
Ultima resposta 31 de jul. de 2008
Respostas 1
Participantes 2