Dicas de como integrar Srpring + Hibernate

10 respostas
anderson.bonavides

Pessoal, tenho a segunte duvida:
Gostaria de integrar as tecnologias (Spring + Hibernate/JPA), e seguindo alguns materiais que encontrei fiz isto:

hibernate.cfg.xml
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/projetobase</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		<property name="connection.pool_size">10</property>

		<mapping class="br.com.projetobase.modelo.Usuario" />
		<mapping class="br.com.projetobase.modelo.Endereco" />
		<mapping class="br.com.projetobase.modelo.Login" />

	</session-factory>
applicationContext
<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
		<property name="configLocation" value="/WEB-INF/hibernate.cfg.xml" />
		<property name="dataSource" ref="dataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="c3p0.min_size">20</prop>
				<prop key="c3p0.max_size">75</prop>
				<prop key="c3p0.timeout">180</prop>
				<prop key="c3p0.c3p0.idle_test_period">100</prop>
			</props>
		</property>
	</bean>
E a classe HibernateUtility
package br.com.projetobase.dao.session;

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

public class HibernateUtility {

	private static SessionFactory sessionFactory;
	private static Session session;

	static {
		try {
			sessionFactory = new AnnotationConfiguration().configure(
					"/hibernate.cfg.xml").buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
			sessionFactory = null;
		}
	}

	public static Session getSession() {
		return session = sessionFactory.openSession();
	}
}

public class HibernateUtility {

	private static SessionFactory sessionFactory;
	private static Session session;

	static {
		try {
			sessionFactory = new AnnotationConfiguration().configure(
					"/hibernate.cfg.xml").buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
			sessionFactory = null;
		}
	}

	public static Session getSession() {
		return session = sessionFactory.openSession();
	}
}

Agora não sei mais para onde ir. Antes eu estava usando Hibernate sem o spring, mas acho que ficaria feio. Então quero fazer desta forma. O que acham?

10 Respostas

Pedrosa

Cara vc pode extender a classe HibernateDaoSupport e abstrair essa parte da conexao com o Spring:

public abstract class CommonsDAOHibernate extends HibernateDaoSupport {
	/**
	 * Insere um novo objeto
	 * 12/09/2006
	 * 
	 * @param object Objeto a ser inserido
	 * @throws Exception
	 * @throws Exception
	 * @throws Exception
	 */
    public boolean inserir(Object object) throws Exception {
       	getHibernateTemplate().save(object);
       	getHibernateTemplate().flush();
           	
      	return true;
	}

	/**
	 * 
	 * 12/09/2006
	 * 
	 * @param object Objeto a ser alterado
	 * @throws Exception
	 */
    public void alterar(Object object) throws Exception{
       	getHibernateTemplate().update(object);
       	getHibernateTemplate().flush();
	}

Se precisar obter a session:

getSession()
anderson.bonavides

E o que aconteceria com o applicationContext?

Pedrosa

Ele é o arquivo de configuração do Spring a magica depende dele.

anderson.bonavides

Desculpe Pedrosa eu sou altamente novo no spring e no hibernate, antes utilizava apenas o JPA puro. A minha duvida é como integrar(já uso declarando os beans do jsf), no momento estou conseguindo usar o hibernate puro mesmo com alguns problemas. Acredito que quando unificar eles desapareçam devido ao contele de injeção.
Se eu usar esta sua classe CommonsDAOHibernate o que eu faço com o meus métodos de salvar e listar q fiz no GenericDAO?

Pedrosa

Primeiramente vc precisa terminar de configurar o context do Spring olha a referencia oficial, seria algo mais ou menos assim o seu genericDAO com Spring:

http://www.urubatan.com.br/dao-generico-um-exemplo-a-pedidos/

anderson.bonavides

Obrigado Pedrosa.

E

Boa tarde a todos,
estou na mesma situação do colega Anderson, estou utilizando hibernate puro e estou tentando integrar com Spring. Não estou utilizando arquivos de mapeamento hbm, apenas o de configuração do hibernate e anotações JPA. Está ocorrendo a seguinte exceção no momento do carregamento do applicationContext:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="scdc.model.entity.Area"/>

o que está faltando na configuração a seguir:

...
<bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/jdbc.properties"/>
    </bean>

    <bean id = "dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value ="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value ="${jdbc.url}"/>
        <property name="user" value ="${jdbc.user}"/>
        <property name="password" value ="${jdbc.password}"/>
    </bean>

    <bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:/hibernate.cfg.xml"/>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

Desde já agradeço!

anderson.bonavides

Eu acabei não integrando e estou utilizando o hibernate sem o spring, mas se alguem tiver a solução eu vou agradecer muito.

=)

E

Consegui resolver graças a este post:
http://rogerioalcantara.blogspot.com/2009/03/netbeans-65-hibernate3-restful-jersey.html

bem agora posso dar continuidade no trabalho… tirar aquele monte de openSession() close() dos meus daos hehehehe… Bem e vc ainda está interessado no Spring anderson?

anderson.bonavides

Bem o Spring eu já uso, mas não uso com o hibernate e este eu tenho interesse de usar sim.

=]

Criado 23 de março de 2009
Ultima resposta 19 de mai. de 2009
Respostas 10
Participantes 3