EventListeners, использующие Hibernate 4.0 с весны 3.1.0. - PullRequest
19 голосов
/ 23 декабря 2011

Эти банки выпущены недавно и содержат новейшие решения для приложений Java EE.Но у меня есть проблема при указании hibernate-слушателей в hibernate.cfg.xml.

До весны 3.1.0 LocalSessionFactroyBean содержал атрибут, который хранит списки событий.Но в версии 3.1.0.release отсутствует карта событийных списков.Теперь я не могу отслеживать модальные объекты на saveorupdate, postload и т. Д., Потому что они не настроены Spring.У вас есть идея, чтобы решить эту проблему?

Ответы [ 4 ]

34 голосов
/ 26 января 2012

У меня была такая же неприятная проблема.Похоже, что Hibernate 4 коренным образом изменил способ регистрации событий, а группа Spring еще не настала.Вот мое решение на основе аннотаций, использующее метод init для регистрации прослушивателя:

@Component
public class HibernateEventWiring {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private SomeHibernateListener listener;

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

Перехватчик был бы еще одним хорошим подходом, но поддержка перехватчиков была по ошибке отброшена: https://jira.springsource.org/browse/SPR-8940

13 голосов
/ 26 июля 2012

Новый подход заключается в использовании интегратора для регистрации прослушивателей событий.Hibernate теперь будет использовать обнаружение служб для регистрации прослушивателей событий, и вот как я заставил его работать с помощью maven archetype-webapp

создайте файл в META-INF / services (который должен находиться в каталоге ваших ресурсов) с именемorg.hibernate.integrator.spi.Integrator со всеми классами, которые реализуют интерфейс spi hibernate, по одной строке каждый.Краткий пример ниже:

...

META-INF / services / org.hibernate.integrator.spi.Integrator

com.example.CustomIntegrator

com.example.CustomIntegrator

package com.example;

import ...;

public void CustomIntegrator implements Integrator {

    static final Logger logger = LoggerFactory.getLogger(CustomIntegrator.class);

    @Override
    public void integrate(Configuration configuration, SessionFactoryImplementor implementor, SessionFactoryServiceRegistry registry) {
        final EventListenerRegistry eventRegistry = registry.getService(EventListenerRegistry.class);

        logger.info("Registering event listeners");
        // you can add duplication strategory for duplicate registrations
        ...

        // prepend to register before or append to register after
        // this example will register a persist event listener
        eventRegistry.prependListeners(EventType.PERSIST, myListener);
        ...
    }

    ...

}

com.example.MyListener

package com.example;

import ...

public class MyListener implements PersistEventListener {

    static final Logger logger = LoggerFactory.getLogger(MyListener.class);

    public void onPersist(PersistEvent event) throws HibernateException {
        logger.debug("Entering MyListener");

        if(event.getObject() instanceof MyPersistableEntity) {
            MyPersistableEntity entity = (MyPersistableEntity) event.getObject();
            // do something with entity
            ...
        }
    }

    ...
}

Любой объект, которому необходимо зарегистрировать это событие, должен реализовать MyPersistableEntity (здесь не показано)

4 голосов
/ 11 июня 2012

Возможно, вы захотите проверить Hibernate Ticket [1]: https://hibernate.onjira.com/browse/HHH-6945

Руководство по миграции говорит:

hibernate.cfg.xml больше не поддерживается как средство указания слушатели. Новый подход предполагает использование org.hibernate.integrator.spi.Integrator, который работает на основе "службы открытие».

И вы можете получить полные инструкции @ http://in.relation.to/Bloggers/EventListenerRegistration

Ссылки в билете имеют некоторые проблемы, используйте следующее:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/main/java/org/hibernate/envers/event/EnversIntegrator.java

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator

Надеюсь, это поможет кому-то найти ответы на эту проблему.

0 голосов
/ 18 января 2018

При добавлении пользовательских прослушивателей событий через класс EventListenerRegistry, как указано в ответах выше, необходимо убедиться, что прослушиватели событий по умолчанию удалены.В противном случае, если в вашем приложении есть однозначное отображение, то будет выдано исключение «Hibernate: исключение общих ссылок на коллекцию: xyz»

...