java - tutorial - Inyectando campos a través de Spring en entidades cargadas por Hibernate
spring java hibernate (4)
Hay una instalación para esto, utilizando el tejido de clase AspectJ con la anotación @Configurable
. Esto transferirá automáticamente cualquier instancia new
de una clase anotada con dependencias de Spring, incluidos los objetos instanciados a través de la reflexión utilizando los gustos de Hibernate.
Requiere una magia de carga de clases, y por lo tanto depende de la compatibilidad con su plataforma de servidor .
Estoy buscando una forma de inyectar ciertas propiedades a través de Spring en un bean cargado desde el DB por Hibernate.
P.ej
class Student {
int id; //loaded from DB
String name; //loaded from DB
int injectedProperty; //Inject via Spring
}
¿Puedo configurar Spring para que cada vez que Hibernate cree objetos de la clase Student, algunas propiedades definidas en algún archivo applicationContext se inyecten con la creación del objeto?
Mientras que el modo aspectj funciona, diría que la forma estándar de spring / hibernate es registrar un LoadEventListener (lea más en la referencia central de hibernación , la referencia de primavera y este hilo )
Aquí hay un recorte de la definición de beans de fábrica de la sesión de primavera
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
<property name="eventListeners">
<map>
<entry key="post-load">
<bean class="com.foo.spring.MyLoadListener"></bean>
</entry>
</map>
</property>
</bean>
y aquí está el LoadEventListener:
public class MyLoadListener implements LoadEventListener{
public void setSpringManagedProperty(String springManagedProperty){
this.springManagedProperty = springManagedProperty;
}
private String springManagedProperty;
@Override
public void onLoad(LoadEvent event, LoadType loadType) throws HibernateException{
if(MyEntity.class.getName().equals(event.getEntityClassName())){
MyEntity entity = (MyEntity) event.getInstanceToLoad();
entity.setMyCustomProperty(springManagedProperty);
}
}
}
Mira mamá, no se necesita ningún aspecto.
Puede inyectar la dependencia en el bean DAO de hibernación para la entidad y establecer la propiedad en la entidad antes de devolverla desde el DAO.
Esto solo funcionará si está cargando la entidad desde el DAO
Una forma es definir el tipo de usuario personalizado y acceder a las propiedades desde la configuración del resorte hasta allí. Pero creo que obtendrás mejores respuestas de los demás :).