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

时间:2010-08-17 17:56:30

标签: java hibernate spring dependency-injection

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

E.g。

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

我可以配置Spring,以便每当Hibernate创建类Student的对象时,某些applicationContext文件中定义的某些属性会被注入对象创建吗?

4 个答案:

答案 0 :(得分:29)

虽然the aspectj way有效,但我会说标准的spring / hibernate方式是注册LoadEventListener(在hibernate core referencespring reference和{{ 3}})

这是来自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);
        }

    }

}

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

答案 1 :(得分:10)

使用AspectJ class weaving with the @Configurable annotation可以实现此功能。这将使用Spring依赖项自动连接带注释的类的任何new实例,包括使用Hibernate等通过反射实例化的对象。

它确实需要一些类加载魔法,因此取决于compatibility with your server platform

答案 2 :(得分:0)

一种方法是定义自定义用户类型并从那里的spring配置访问属性。但我认为你会得到更好的回复:)。

答案 3 :(得分:0)

您可以将依赖项注入实体的hibernate DAO bean,并在从DAO返回实体之前设置该实体的属性。

只有从DAO

加载实体时才会有效