Hibernate Annotations con Spring
Para utilizar las anotaciones de Hibernate junto con Spring tenemos que reemplazar en el archivo application-hibernate.xml la clase org.springframework.orm.hibernate3.LocalSessionFactoryBean por org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean:
Ejemplo de uso
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <value>com.app.domain.Abonado</value> <value>com.app.domain.Cliente</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean>
Querys con Spring
@Entity @Table (name="cliente") //DECLARO LOS QUERIES @NamedQueries( {@NamedQuery(name="buscarPorIdCliente", query="select a from Cliente a where a.idCliente= ?"), @NamedQuery(name="buscarPorIdSucursal", query="select a from miTabla a where a.idSucursal= ?")}) public class Cliente{ @Id @Column (name="COD_CLIENTE") private Long id; @Column (name="COD_SUCURSAL") private String idSucursal; ................. }
DAO
public class ClienteDaoImpl extends HibernateDaoSupport implements ClienteDao { public Collection buscarPorIdCliente(String idCliente) { return getHibernateTemplate(). findByNamedQuery("buscarPorIdCliente", idCliente); } public Collection buscarPorIdSucursal(String idSucursal) { return getHibernateTemplate(). findByNamedQuery("buscarPorIdSucursal", idSucursal); } }
Mapeo de Recursos y Mapeo de Clases Anotadas
En el archivo de configuración application-hibernate.xml se puede mezclar el mapeo a archivos xml y a clases anotadas sin problemas. Esto nos será muy útil al momento de "migrar" una aplicación de mapeo en archivos xml a clases anotadas, pudiendo hacer la migración en forma progresiva.
La clase del SessionFactory que se debe utilizar en estos casos tambien es:
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <value>com.app.domain.Cliente</value> </list> </property> <property name="mappingResources"> <list> <value>com/app/domain/Cliente</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean>
Noten que mientras los mapeos por archivos XML DEBEN nombrarse con / (barra) entre los directorios, las clases anotadas DEBEN nombrarse con . (punto).