Spring Boot 2.1.2, Hibernate 5: зарегистрируйте прослушиватели событий Hibernate (Вставить / Обновить / Удалить) - PullRequest
1 голос
/ 17 апреля 2019

Когда я использовал Hibernate 4 в предыдущем приложении Spring, следующего было достаточно, чтобы зарегистрировать весь перехват событий вставки / обновления / удаления БД.Был простой класс конфигурации и фактическая реализация перехватчика.

класс конфигурации

@Component
public class HibernateEntityEventListenerConfig {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private HibernateEntityEventListener entityEventListener;

    @PostConstruct
    public void registerListeners() {
          final EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
                    .getServiceRegistry().getService(EventListenerRegistry.class);
            registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
            registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
            registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
    }

}

класс перехватчика

@Component
public class HibernateEntityEventListener implements PreInsertEventListener,
                                                     PreUpdateEventListener,    
                                                     PreDeleteEventListener {

@Override
public boolean onPreInsert(PreInsertEvent event) {
  //...
}

@Override
public boolean onPreUpdate(PreUpdateEvent event) {
  //...
}

@Override
public boolean onPreDelete(PreUpdateEvent event) {
  //...
}

Но когда я портировал этот код в приложение Spring Boot 2.1.2 с использованием Hibernate 5, я начал получать следующую ошибку запуска о том, что SessionFactory не найдено:

Field sessionFactory in util.HibernateEntityEventListenerConfig required 
a bean of type 'org.hibernate.SessionFactory' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.hibernate.SessionFactory' in your configuration.

Я гуглилвокруг, и я нашел только более сложный и запутанный код, которому я не доверяю или не понимаю, https://stackoverflow.com/a/48471227/1005607

Сейчас это слишком сложно, и мне просто нужен простой способ связать этот перехватчик.Как правильно вставить перехватчики и обойти эту ошибку SessionFactory?

1 Ответ

1 голос
/ 17 апреля 2019

Я нашел решение в блоге Божо , код может оставаться в основном таким же, как и раньше, но я не могу больше автоматически SessionFactory: мне нужно вместо этого автоматически подключить EntityManagerFactory, а затем "разверните "это как SessinFactoryImpl sf = emf.unwrap(..).Это единственное изменение.

Последний код: Конфигурация:

@Component   
public class HibernateEntityEventListenerConfig {



@PersistenceUnit
private EntityManagerFactory emf;  // NOTE Can't autowire SessionFactory.

@Autowired
private HibernateEntityEventListener entityEventListener;

@PostConstruct
public void registerListeners() {
    // NOTE the emf.unwrap() to get the SessionFactoryImpl
    SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
    EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
                .getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
        registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
        registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...