Ввод полей с помощью Spring в объекты, загруженные Hibernate
Я ищу способ ввода определенных свойств через Spring в bean, который загружается из БД с помощью Hibernate.
например.
class Student {
int id; //loaded from DB
String name; //loaded from DB
int injectedProperty; //Inject via Spring
}
Могу ли я настроить Spring так, чтобы всякий раз, когда Hibernate создает объекты класса Student, некоторые свойства, определенные в некотором файле applicationContext, вводятся с помощью создания объекта?
Ответы
Ответ 1
Для этого есть средство, используя класс AspectJ, с помощью @Configurable
аннотации. Это приведет к автоматическому подключению любого экземпляра new
аннотированного класса с зависимостями Spring, включая объекты, созданные с помощью отражения с помощью подобных Hibernate.
Это требует некоторой магии загрузки класса, поэтому зависит от совместимости с вашей серверной платформой.
Ответ 2
Пока способ aspectj работает, я бы сказал, что стандартный способ spring/hibernate - зарегистрировать LoadEventListener (читайте в ссылку на гибернацию ядра, spring ссылка и этот поток)
здесь находится отсказка из определения sessionfactory bean
<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>
и вот 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);
}
}
}
Посмотрите, мама, не нужна аспект.
Ответ 3
Один из способов - определить пользовательский тип пользователя и получить доступ к свойствам из конфигурации spring. Но я думаю, вы получите гораздо лучшие ответы от других:).
Ответ 4
Вы можете ввести зависимость в спящий режим DAO bean для объекта и установить свойство на сущности, прежде чем возвращать его из DAO.
Это будет работать, только если вы загружаете объект из DAO