通过 Spring 将字段注入由 Hibernate 加载的实体中

我正在寻找一种方法,通过Spring在Hibernate从DB加载的bean中注入某些属性。

例如:

class Student {
   int id; //loaded from DB
   String name; //loaded from DB
   int injectedProperty; //Inject via Spring
}

我是否可以配置Spring,以便每当Hibernate创建类Student的对象时,某些应用程序Context文件中定义的某些属性都会在对象创建时注入?


答案 1

虽然aspectj方式有效,但我认为标准的弹簧/休眠方法是注册LoadEventListener(在休眠核心参考弹簧参考此线程中阅读更多内容)

这是从春季会议工厂豆的定义中摘录的

<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);
        }

    }

}

看妈妈,不需要任何方面j。


答案 2

有一个工具可以做到这一点,使用AspectJ类编织和@Configurable注释。这将使用Spring依赖项自动连接带注释的类的任何实例,包括使用Hibernate等通过反射实例化的对象。new

它确实需要一些类加载魔术,因此取决于与服务器平台的兼容性


推荐