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).