3

Spring 3.1.0.RELEASE と Hibernate 4.0.1.Final を使用しています。エンティティ Bean が DB からロードされたときにイベント リスナーを呼び出したいのですが、どのイベントを使用すればよいかわかりません。私は自分のエンティティを私の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、プロキシの初期化、熱心な 1 対 1 の関連付けのフェッチ)。

ただし、ロード前およびロード後のイベントは、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 に答える