Eventlisteners с использованием hibernate 4.0 с spring 3.1.0.release?
Эти банки выпущены как новые, так и новейшие решения для приложений Java EE. Но у меня проблема с настройкой прослушиваний спящего режима в hibernate.cfg.xml.
До spring 3.1.0 LocalSessionFactroyBean
хранился атрибут, который хранит список событий. Но с 3.1.0.release нет карты eventlisteners. Теперь я не могу отслеживать модальные объекты на saveorupdate, postload и т.д., Потому что они не настроены с помощью Spring. У вас есть идея решить эту проблему?
Ответы
Ответ 1
У меня была такая же неприятная проблема. 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
Ответ 2
Новый подход - использовать Integrator для регистрации прослушивателей событий. Hibernate теперь будет использовать служебное обнаружение для регистрации прослушивателей событий, и вот как я получил его для работы с помощью maven archetype-webapp
создайте файл в разделе META-INF/services (который должен находиться в вашем каталоге ресурсов), называемом org.hibernate.integrator.spi.Integrator со всеми классами, реализующими интерфейс hibernate spi, по одной строке. Ниже приведен короткий пример:
...
META-INF/услуги/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 (не показано здесь).
Ответ 3
Возможно, вы захотите проверить билет Hibernate [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
Надеюсь, что это помогает кому-то искать ответы на эту проблему.
Ответ 4
При добавлении пользовательских прослушивателей событий через класс EventListenerRegistry, как упоминалось выше, нужно убедиться, что прослушиватели событий по умолчанию удалены. В противном случае, если в вашем приложении есть onetomany, тогда будет выбрано исключение "Hibernate exception: shared references to collection: xyz"