Você está na página 1de 5

 

SpringHibernate  
Usando Hibernate en Spring. 
Spring, Hibernate
Updated Feb 4, 2010 by juan.rop...@gmail.com

Descripción
Hibernate es muy fácil de configurar y usar con Spring.

Archivo de contexto para hibernate


Para la configuración sólo necesitamos un archivo xml (applicationContext-hibernate.xml) en donde
configuramos hibernate.

En el archivo de contexto seteamos la conexión, el SessionFactory, el TransactionManager y


el HibernateTemplate.

Conexión al base de datos

Toda aplicación de Spring que se conecta a una base de datos, necesita de un bean llamado DataSource. En
este bean se establecen los parametros para la conexión a la base.

        <!--========== Spring Data Source ==========-->

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-


method="close">
                <property name="driverClassName">
                        <value>${hibernate.connection.driver_class}</value>
                </property>
                <property name="url">
                        <value>${hibernate.connection.url}</value>
                </property>
                <property name="username">
                        <value>${hibernate.connection.username}</value>
                </property>
                <property name="password">
                        <value>${hibernate.connection.password}</value>
                </property>
        </bean>
       
        <!--========== /Spring Data Source ==========-->
TransactionManager

Este bean se encarga del manejo de transacciones.

        <!--========== TransactionManager ==========-->


       
        <bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory">
                        <ref local="sessionFactory" />
                </property>
        </bean>

        <!--========== /TransactionManager ==========-->


SessionFactory

Este objeto de Hibernate maneja las sesiones que ejecutan las distintas transacciones a la base de datos.

        <!--========== Hibernate SessionFactory ==========-->

        <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                <property name="dataSource">
                        <ref local="dataSource" />
                </property>
                <property name="mappingDirectoryLocations">
                        <list>
                                <value>classpath:../hbms</value>
                        </list>
                </property>
                <property name="hibernateProperties">
                        <props>
                                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                                <prop key="hibernate.max_fetch_depth">$
{hibernate.max_fetch_depth}</prop>
                                <prop key="hibernate.use_outer_join">$
{hibernate.use_outer_join}</prop>
                        </props>
                </property>
        </bean>
       
        <!--========== /Hibernate SessionFactory ==========-->
HibernateTemplate

Este objeto es la clave de nuestros DAOs (Data Access Objects). Este objeto se encarga de guardar, borrar,
listar y obtener los objetos de la base de datos. También se encarga de la excepciones ahorrandonos así
mucho trabajo.

        <!--========== Hibernate Template ==========-->


       
        <bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
                <property name="sessionFactory">
                        <ref bean="sessionFactory" />
                </property>
        </bean>

        <!--========== /Hibernate Template ==========-->


applicationContext-hibernate.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

        <!--========== Spring Data Source ==========-->

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-


method="close">
                <property name="driverClassName">
                        <value>${hibernate.connection.driver_class}</value>
                </property>
                <property name="url">
                        <value>${hibernate.connection.url}</value>
                </property>
                <property name="username">
                        <value>${hibernate.connection.username}</value>
                </property>
                <property name="password">
                        <value>${hibernate.connection.password}</value>
                </property>
        </bean>
       
        <!--========== /Spring Data Source ==========-->
       

        <!--========== TransactionManager ==========-->


       
        <bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory">
                        <ref local="sessionFactory" />
                </property>
        </bean>
       
        <!--========== /TransactionManager ==========-->

        <!--========== Hibernate SessionFactory ==========-->

        <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                <property name="dataSource">
                        <ref local="dataSource" />
                </property>
                <property name="mappingDirectoryLocations">
                        <list>
                                <value>classpath:../hbms</value>
                        </list>
                </property>
                <property name="hibernateProperties">
                        <props>
                                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                                <prop key="hibernate.max_fetch_depth">$
{hibernate.max_fetch_depth}</prop>
                                <prop key="hibernate.use_outer_join">$
{hibernate.use_outer_join}</prop>
                        </props>
                </property>
        </bean>
       
        <!--========== /Hibernate SessionFactory ==========-->
       
        <!--========== Hibernate Template ==========-->
       
        <bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
                <property name="sessionFactory">
                        <ref bean="sessionFactory" />
                </property>
        </bean>

        <!--========== /Hibernate Template ==========-->


       
</beans>

Código
Una vez configurado Hibernate creamos una clase abstracta que extienda de HibernateDaoSupport. ¡¡ Y
listo !! :D.
AbstractHibernateDAO

Esta clase se encarga de realizar las altas, bajas, modificaciones, actualizaciones y listados de nuestros
objetos. Por ello y para no escribir código de más esta clase es abstracta y utiliza generics .

public abstract class AbstractHibernateDAO<DomainObject extends Serializable, KeyType


extends Serializable> extends HibernateDaoSupport{

Como se puede observar en el código los tipos genericos que utiliza son DomainObject y KeyType, ambos
extienden de Serializable ya que sino Hibernate no los puede persistir.

DomainObject es el objeto del dominio que queremos persistir con Hibernate.

KeyType es el tipo del id de la clase DomainObject.

El único método que deben implementar las clases que extiendan


de AbstractHibernateDAO es getDomainClass():

protected abstract Class<DomainObject> getDomainClass();

A continuación el código de la clase:

package ar.com.usca.model.dao.definition;

import java.io.Serializable;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public abstract class AbstractHibernateDAO<DomainObject extends Serializable, KeyType


extends Serializable> extends HibernateDaoSupport{
       
        protected Class<DomainObject> domainClass = getDomainClass();
       
        protected abstract Class<DomainObject> getDomainClass();
       
        public DomainObject load(KeyType id){
                return (DomainObject)getHibernateTemplate().load(getDomainClass(), id);
        }
   
    public void update(DomainObject object){
        getHibernateTemplate().update(object);
    }

    public void save(DomainObject object){


        getHibernateTemplate().save(object);
    }

    public void delete(DomainObject object){


        getHibernateTemplate().delete(object);
    }
   
    public void deleteById(KeyType id){
        Object obj = load(id);
        getHibernateTemplate().delete(obj);
    }
    public List<DomainObject> getList(){
        return (getHibernateTemplate().find("from " + domainClass.getName() + " o"));
    }
   
    public void deleteAll(){
         getHibernateTemplate().execute(new HibernateCallback() {
             public Object doInHibernate(Session session) throws HibernateException {
                 String hqlDelete = "delete " + domainClass.getName();
                 int deletedEntities = session.createQuery(hqlDelete).executeUpdate();
                 return null;
             }

         });

    }
   
    public int count(){
        List list = getHibernateTemplate().find(
                "select count(*) from " + domainClass.getName() + " o");
        Integer count = (Integer) list.get(0);
        return count.intValue();
    }
}
Extendiendo de AbstractHibernateDAO

A continuación está el código del SeniorityDAO:

package ar.com.usca.model.dao.imp;

import ar.com.usca.model.dao.definition.AbstractHibernateDAO;
import ar.com.usca.model.entity.Seniority;

public class SeniorityDAO extends AbstractHibernateDAO<Seniority, Long> {

        @Override
        protected Class<Seniority> getDomainClass() {
                return Seniority.class;
        }
}

Como pueden observar la clase AbstractHibernateDAO nos simplifico mucho las cosas, solo tuvimos que
implementar un método y ya podemos realizar altas, bajas y modificaciones de Seniorities en nuestra base de
datos. Sólo resta agregar métodos para operaciones especiales, como por ejemplo, obtener un Seniority a
partir de un nombre.

Você também pode gostar