Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Injecting fields via Spring into entities loaded by Hibernate

I am looking for a way to inject certain properties via Spring in a bean that is loaded from the DB by Hibernate.

E.g.

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

Can I configure Spring so that whenever Hibernate creates objects of class Student, some properties as defined in some applicationContext file are injected with the object creation?

like image 920
Aayush Puri Avatar asked Aug 17 '10 17:08

Aayush Puri


2 Answers

While the aspectj way works, I'd say the standard spring / hibernate way is to register a LoadEventListener (read more in the hibernate core reference, the spring reference and this thread)

here is a snip from the spring sessionfactory bean definition

<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>

and here is the 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);
        }

    }

}

Look mom, no aspectj needed.

like image 175
Sean Patrick Floyd Avatar answered Nov 02 '22 22:11

Sean Patrick Floyd


There is a facility for this, using AspectJ class weaving with the @Configurable annotation. This will auto-wire any new instance of an annotated class with Spring dependencies, including objects instantiated via reflection using the likes of Hibernate.

It does require some class-loading magic, and so depends on compatibility with your server platform.

like image 41
skaffman Avatar answered Nov 03 '22 00:11

skaffman