Подтвердить что ты не робот

Ввод полей с помощью 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, вводятся с помощью создания объекта?

4b9b3361

Ответ 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