Обновление прослушивателя событий не меняет сущность - PullRequest
0 голосов
/ 17 июня 2020

Чтобы обновить свойство update updatedTime родительского элемента при изменении дочернего элемента, я решил использовать прослушиватели событий в Hibernate. Я прочитал много вопросов о stackoverflows и блогов VladMihalcea и подумал, что могу это сделать, однако я застрял.

@Component
public class HibernateEventListenerConfig {

    @PersistenceUnit
    private EntityManagerFactory emf;

    @PostConstruct
    protected void init() {
        SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
        EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
//        registry.getEventListenerGroup(EventType.PERSIST).prependListener(CustomEventListener.INSTANCE);
//        registry.getEventListenerGroup(EventType.SAVE_UPDATE).prependListener(CustomEventListener.INSTANCE);
//        registry.getEventListenerGroup(EventType.DELETE).prependListener(CustomEventListener.INSTANCE);
        registry.getEventListenerGroup(EventType.PRE_UPDATE).prependListener(CustomEventListener.INSTANCE);
//        registry.getEventListenerGroup(EventType.FLUSH_ENTITY).prependListener(CustomEventListener.INSTANCE);
    }
}

Я наблюдаю, когда я добавляю свой EventListener для PERSIST и DELETE, все работает, как ожидалось ( Я вижу, что время изменилось, и изменение распространяется в базу данных). Однако у меня проблема с обновлением. Я пробовал использовать SAVE_UPDATE, UPDATE, FLUSH_ENTITY из блога VladMihalcea, но все же я не вижу, как изменение распространяется на базу данных (у меня включены журналы)

Это код из моего CustomEventListener. (цепочка обновления методов и связывание работают правильно, поскольку я вижу обновление, когда сохраняю или удаляю дочернюю сущность)


public class CustomEventListener implements PersistEventListener, DeleteEventListener, SaveOrUpdateEventListener, PreUpdateEventListener {
    public static final CustomEventListener INSTANCE = new CustomEventListener();

    @Override
    public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException {
        updateRelatedObjects(event.getObject());
    }

    @Override
    public boolean onPreUpdate(PreUpdateEvent event) {
        updateRelatedObjects(event.getEntity());
        return false;
    }

    @Override
    public void onPersist(PersistEvent event) throws HibernateException {
        updateRelatedObjects(event.getObject());
    }

    @Override
    public void onDelete(DeleteEvent event) throws HibernateException {
        updateRelatedObjects(event.getObject());
    }

    @Override
    public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
        onDelete(event);
    }

    @Override
    public void onPersist(PersistEvent event, Map createdAlready) throws HibernateException {
        onPersist(event);
    }

    private void updateRelatedObjects(Object object) {
        if (object instanceof BaseClass) {
            BaseClass rootAware = (BaseClass) object;
            rootAware.getRelated().ifPresent(BaseClass::updateChain);
        }
    }
}

Знаете ли вы, о чем я забыл при обновлении сущности? Я что-то упустил? Если это так, как я могу обновить свой relatedObject?

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