3

我正在使用 Spring 3.1.0.RELEASE 和 Hibernate 4.0.1.Final。我想在从数据库加载实体 bean 时调用它的事件侦听器,但我不知道应该使用什么事件。我像这样在我的 DAO 中加载我的实体

@Repository("eventFeedsDao")
public class EventFeedsDaoImpl implements EventFeedsDao {

    ...
    @Autowired
    private SessionFactory sessionFactory;

    ...

    @Override
    public EventFeed findById(final Integer id) { 
        EventFeed eventFeed = null;
        final Session session = sessionFactory.getCurrentSession();
        final Criteria crit = session.createCriteria(EventFeed.class).add(Restrictions.eq("id", id));
        final List<EventFeed> results = crit.list();
        if (results != null && results.size() > 0) { 
            eventFeed = results.get(0);
        }   // if
        return eventFeed;       
    }   // findById 

这是我尝试设置事件接线的方式...

@Component
public class HibernateEventWiring {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private EventMavenLoadListener listener;

    @PostConstruct
    public void registerListeners() {
        EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
            .getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.LOAD).appendListener(listener);
    }
}

我的听众班级如下......

@Component
public class EventMavenLoadListener implements LoadEventListener {

    ...

    @Override
    public void onLoad(final LoadEvent event, final LoadType loadType) throws HibernateException {
        if(EventFeed.class.getName().equals(event.getEntityClassName())){
            EventFeed entity = (EventFeed) event.getInstanceToLoad();
            entity.setNetUtilsService(netUtilsService);
        }   // if
    }

}

但永远不会调用“onLoad”事件。我究竟做错了什么?我应该使用另一个事件吗?

4

2 回答 2

2

出于某种我仍然无法理解的原因,EventType.PRE_LOAD 事件类型是要走的路。这行得通。

@Component
public class HibernateEventWiring {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private EventMavenLoadListener listener;

    @PostConstruct
    public void registerListeners() {
        final EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
                .getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.PRE_LOAD)
                .appendListener((PreLoadEventListener) listener);
    }
}
于 2012-05-30T20:58:26.053 回答
0

load 事件仅在单独加载实体时触发(session.get、初始化代理、获取渴望一对一的关联)。

然而,加载前和加载后事件遵循 JPA 定义的行为,并在加载实体数据之前和之后发生,无论“数据加载”如何发生。

这是一个坏名声冲突的案例。

顺便说一句,Hibernate 4 中指定事件侦听器的首选方法是使用 org.hibernate.integrator.spi.Integrator。请参阅http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#integrators

于 2012-05-30T21:41:59.750 回答