2012-05-15 48 views
2

我使用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」事件永遠不會被調用。我究竟做錯了什麼?我應該使用另一個事件嗎?

回答

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); 
    } 
} 
0

加載事件僅在單獨加載實體時觸發(session.get,初始化代理,獲取渴望的一對一關聯)。

然而,事先和事後加載事件遵循JPA定義的行爲,並且在實體數據加載之前和之後發生,無論如何發生「數據加載」。

它是一個不良名稱衝突的情況。

在Hibernate 4中btw指定事件偵聽器的首選方法是使用org.hibernate.integrator.spi.Integrator。請參閱http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#integrators

+0

關於集成商,爲什麼這比我發現的事件佈線類更好?我假設我必須用「@Component」註釋集成器類?感謝您的建議, - – Dave

+0

可以通過JDK ServiceLoader類/模式發現集成器。這使得在不控制SessionFactory構建的情況下(Spring,JPA等)更容易使用它(很多)。你的意思是@Component的發現目的?如果是這樣,不,它的發現是通過ServiceLoader,正如我所提到的。它包含在我上面鏈接的文檔中,但您必須轉到鏈接部分http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#services-IntegratorService –