Estoy usando la Primavera 3.1.0.Con la LIBERACIÓN de Hibernación 4.0.1.Final. Quiero invocar un detector de eventos en mi bean de entidad cuando se carga desde la DB, pero no puedo averiguar a qué evento que debo utilizar. Puedo cargar mi entidades en mi DAO como

@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 

Aquí es cómo estoy tratando de configurar mi caso cableado …

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

y mi clase de escucha es la siguiente …

@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
    }

}

pero el «onLoad» evento nunca es llamado. ¿Qué estoy haciendo mal? Debo usar otro evento?

InformationsquelleAutor Dave | 2012-05-15

2 Comentarios

  1. 2

    Por alguna razón que todavía se me escapa, la EventType.PRE_LOAD tipo de evento era el camino a seguir. Esto funcionó.

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

    El evento de carga se activa sólo cuando la carga de una entidad individual (sesión.obtener, la inicialización de un proxy, con ganas de ir a buscar a uno de sus asociaciones).

    El pre y post eventos de carga sin embargo sigue JPA comportamiento definido y se producen antes y después de que la entidad se cargan los datos, independientemente de cómo esa «carga de datos» se ha producido.

    Se trata de un caso de mala colisión de nombres.

    La forma preferida en Hibernate 4, por cierto, para especificar los detectores de eventos es a través del uso de una org.hibernate.el integrador.spi.El integrador. Ver http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#integrators

    • Con respecto al integrador, ¿por qué esto es mejor que el evento de cableado de clase me encontré? Supongo que tengo que anotar el integrador de la clase con un «@Componente»? Gracias por la sugerencia, –
    • Los integradores pueden ser detectable a través de la JDK ServiceLoader clase/patrón. Lo que la hace mucho (mucho) más fácilmente utilizable en situaciones donde no tenemos control sobre el SessionFactory edificio (Spring, JPA, etc). A qué te refieres @Componente para fines de descubrimiento? Si es así, no, su descubrimiento es a través de ServiceLoader como ya he mencionado. Es cubierto en la documentación que he enlazado más arriba, aunque tienes que ir a los enlaces de la sección docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/…

Dejar respuesta

Please enter your comment!
Please enter your name here