我使用Spring 3.1.0.RELEASE和Hibernate 4.0.1.Final。我想在從數據庫加載實體bean時調用事件偵聽器,但我無法弄清楚我應該使用什麼事件。我打開我的實體在我的DAO像這樣如何在Hibernate 4實體上設置事件偵聽器?
@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」事件永遠不會被調用。我究竟做錯了什麼?我應該使用另一個事件嗎?
關於集成商,爲什麼這比我發現的事件佈線類更好?我假設我必須用「@Component」註釋集成器類?感謝您的建議, - – Dave
可以通過JDK ServiceLoader類/模式發現集成器。這使得在不控制SessionFactory構建的情況下(Spring,JPA等)更容易使用它(很多)。你的意思是@Component的發現目的?如果是這樣,不,它的發現是通過ServiceLoader,正如我所提到的。它包含在我上面鏈接的文檔中,但您必須轉到鏈接部分http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#services-IntegratorService –