Diferencia entre revisiones de «Hibernate Con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(La declaracion del Dao)
(Configuración con anotaciones)
 
(No se muestran 15 ediciones intermedias de 10 usuarios)
Línea 1: Línea 1:
 +
[[Category:Spring Framework]]
 +
[[Category:Hibernate]]
 
[[Spring Framework]] provee amplio soporte para [[Hibernate]]. En particular, brinda implementaciones de [[DAO]] que ofrecen diversas utilidades para acceder a la session de Hibernate.
 
[[Spring Framework]] provee amplio soporte para [[Hibernate]]. En particular, brinda implementaciones de [[DAO]] que ofrecen diversas utilidades para acceder a la session de Hibernate.
  
Línea 4: Línea 6:
  
 
Spring nos provee la clase ''HibernateDaoSupport'' para brindarle a nuestros DAO soporte para Hibernate.
 
Spring nos provee la clase ''HibernateDaoSupport'' para brindarle a nuestros DAO soporte para Hibernate.
 +
 +
'''Importante:''' ¡Esta clase está obsoleta y no debería utilizarse!. En cambio, crear un DAO común e inyectar el '''SessionFactory''' de Hibernate directamente, para utilizar.
  
 
=== HibernateTemplate ===
 
=== HibernateTemplate ===
  
En particular, uno de los métodos más útiles que provee es ''getHibernateTemplate()''. Este método devuelve un template con varios métodos útiles, que simplifican el uso de Hibernate. Estos métodos suelen encapsular varias excepciones propias de acceso a datos de Hibernate (y SQL) dentro de una ''DataAccessException'' (que hereda de RuntimeException).
+
En particular, '''uno de los métodos''' más útiles que provee es ''getHibernateTemplate()''. Este método devuelve un template con varios métodos útiles, que simplifican el uso de Hibernate. Estos métodos suelen encapsular varias excepciones propias de acceso a datos de Hibernate (y SQL) dentro de una ''DataAccessException'' (que hereda de RuntimeException).
  
 
===Creando un DAO con soporte de Spring===
 
===Creando un DAO con soporte de Spring===
Línea 54: Línea 58:
  
 
===Uso de la Session directamente===
 
===Uso de la Session directamente===
Es posible utilizar la Session de Hibernate directamente, a través del método ''getSession()'' que provee HibernateDaoSupport. Cuando se pide la Session de esta manera, es fundamental liberarla al finalizar su uso con el método ''releaseSession()''.
+
Es posible utilizar la Session de Hibernate directamente, a través del método ''getSession()'' que provee HibernateDaoSupport. Cuando se pide la Session de esta manera, es fundamental
 +
 
 +
<code java>
 +
Session session = null;
 +
try {
 +
    session = getSession();
 +
    //hacer cosas...
 +
}
 +
finally {
 +
    releaseSession(session);
 +
}
 +
</code>
 +
 
 +
== Configuración con anotaciones ==
 +
Hibernate puede configurarse con anotaciones en vez de archivos XML para definir los mapeos. Para esto usamos la clase de Spring '''AnnotationSessionFactoryBean'''.
 +
<code xml>
 +
<beans>
 +
 
 +
  <bean id="defaultSessionFactory"
 +
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 +
    <property name="dataSource" ref="defaultDataSource" />
 +
    <property name="annotatedClasses">
 +
      <list>
 +
        <!-- Agregar los mappings necesarios -->
 +
        <value>com.dosideas.domain.MiClaseDeDominio</value>
 +
      </list>
 +
 
 +
    </property>
 +
    <property name="hibernateProperties">
 +
      <props>
 +
            <prop key="hibernate.show_sql">true</prop>
 +
      </props>
 +
    </property>
 +
  </bean>
 +
 
 +
</beans>
 +
</code>
 +
 
 +
También puede usarse un scan automático de paquetes, de manera de no tener que agregar manualmente cada clase anotada. Para hacer esto, es necesario configurar el atributo "packagesToScan" de la clase AnnotationSessionFactoryBean, indicando allí el paquete donde buscar. Por ejemplo:
 +
<code xml>
 +
<beans>
 +
 
 +
  <bean id="defaultSessionFactory"
 +
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 +
    <property name="dataSource" ref="defaultDataSource" />
 +
    <property name="packagesToScan" value="com.dosideas.domain"/>
 +
  </bean>
 +
 
 +
</beans>
 +
</code>
 +
 
 +
Y la clase de dominio anotada como corresponde:
 +
 
 +
<code java5>
 +
package com.dosideas.domain;
 +
 
 +
import javax.persistence.Column;
 +
import javax.persistence.Entity;
 +
import javax.persistence.Id;
 +
import javax.persistence.Table;
 +
 
 +
@Entity
 +
@Table(name = "TABLA_DE_ORIGEN")
 +
public class MiClaseDeDominio {
 +
    @Id
 +
    @Column(name = "COLUMNA_PK")
 +
    private String clase;
  
La misma clase del ejemplo anterior quedaría:
+
    @Column(name = "NOMBRE")
 +
    private String nombre;
  
<code java>
+
    //getters y setters...
public class InvasorDaoImpl extends HibernateDaoSupport implements InvasorDao  {
+
}
    public void guardarInvasor(Invasor invasor) {
 
        Session session;
 
        try {
 
            session = getSession();
 
            session.save(invasor);
 
        }
 
        finally {
 
            releaseSession(session);
 
        }
 
    }
 
}
 
 
</code>
 
</code>
  

Revisión actual del 12:45 23 nov 2011

Spring Framework provee amplio soporte para Hibernate. En particular, brinda implementaciones de DAO que ofrecen diversas utilidades para acceder a la session de Hibernate.

La clase HibernateDaoSupport

Spring nos provee la clase HibernateDaoSupport para brindarle a nuestros DAO soporte para Hibernate.

Importante: ¡Esta clase está obsoleta y no debería utilizarse!. En cambio, crear un DAO común e inyectar el SessionFactory de Hibernate directamente, para utilizar.

HibernateTemplate

En particular, uno de los métodos más útiles que provee es getHibernateTemplate(). Este método devuelve un template con varios métodos útiles, que simplifican el uso de Hibernate. Estos métodos suelen encapsular varias excepciones propias de acceso a datos de Hibernate (y SQL) dentro de una DataAccessException (que hereda de RuntimeException).

Creando un DAO con soporte de Spring

La forma más simple de usar Hibernate con Spring es crear clases que hereden de !HibernateDaoSupport. Esta clase ofrece varias utilidades para manipular la session de Hibernate, y se encarga de manejar automáticamente las transacciones.

La interfaz del DAO

La interfaz de nuestro DAO es simple, y no necesita tener ninguna herencia ni restricción en particular:

public interface InvasorDao {
    guardarInvasor(Invasor invasor);
}

La implementación del DAO

La implementación del DAO deberá extender !HibernateDaoSupport. Esta clase nos proveerá de varios métodos útiles para manipular la session de Hibernate.

public class InvasorDaoImpl extends HibernateDaoSupport implements InvasorDao   {
    public void guardarInvasor(Invasor invasor) {
        getHibernateTemplate().save(invasor);
    }
}

La declaracion del Dao

En el XML de Spring deberemos declarar el Dao y la Factory de Hibernate. Al Dao se le asocia el factory de Hibernate del cual Spring sacará la session de Hibernate.

<bean id="dao.InvasorDao" class="com.dosideas.dao.impl.InvasorDaoImpl">
    <property name="sessionFactory" ref="defaultSessionFactory"/>
</bean>
<bean id="defaultSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="defaultDataSource" />
    <property name="mappingResources">
        <list>
               <value>com/dosideas/domain/map/Invasor.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
           <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
        </props>
    </property>
</bean>

Uso de la Session directamente

Es posible utilizar la Session de Hibernate directamente, a través del método getSession() que provee HibernateDaoSupport. Cuando se pide la Session de esta manera, es fundamental

Session session = null; try {

   session = getSession();
   //hacer cosas...

} finally {

   releaseSession(session);

}

Configuración con anotaciones

Hibernate puede configurarse con anotaciones en vez de archivos XML para definir los mapeos. Para esto usamos la clase de Spring AnnotationSessionFactoryBean. <beans>

 <bean id="defaultSessionFactory"
   class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="defaultDataSource" />
   <property name="annotatedClasses">
     <list>
       <value>com.dosideas.domain.MiClaseDeDominio</value>
     </list>
   </property>
   <property name="hibernateProperties">
     <props>
           <prop key="hibernate.show_sql">true</prop>
     </props>
   </property>
 </bean>

</beans>

También puede usarse un scan automático de paquetes, de manera de no tener que agregar manualmente cada clase anotada. Para hacer esto, es necesario configurar el atributo "packagesToScan" de la clase AnnotationSessionFactoryBean, indicando allí el paquete donde buscar. Por ejemplo: <beans>

 <bean id="defaultSessionFactory"
   class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="defaultDataSource" />
   <property name="packagesToScan" value="com.dosideas.domain"/>
 </bean>

</beans>

Y la clase de dominio anotada como corresponde:

package com.dosideas.domain;

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table;

@Entity @Table(name = "TABLA_DE_ORIGEN") public class MiClaseDeDominio {

   @Id
   @Column(name = "COLUMNA_PK")
   private String clase;
   @Column(name = "NOMBRE")
   private String nombre;
   //getters y setters...

}

Ver también