Injecting fields via Spring into entities loaded by Hibernate

前端 未结 4 873
臣服心动
臣服心动 2020-12-14 08:54

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; //l         


        
相关标签:
4条回答
  • 2020-12-14 09:44

    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.

    0 讨论(0)
  • 2020-12-14 09:45

    One way is to define custom user type and accessing properties from spring configuration over there. But I think you will get much better replies from others :).

    0 讨论(0)
  • 2020-12-14 09:46

    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.

    0 讨论(0)
  • 2020-12-14 09:48

    You can inject the dependency into the hibernate DAO bean for the entity and set the property on the entity before returning it from the DAO.

    This will only work if you are loading the entity from the DAO

    0 讨论(0)
提交回复
热议问题