Чтобы обновить свойство 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?