У меня есть база данных, в которой у сущности (скажем, Пользователь) есть список сущностей (скажем, Список). Как требование, я должен иметь денормализованное количество объектов в списке:
@Entity
class User {
/* ... */
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Friendship> friends;
public int friendsCount;
/* ... */
}
Когда я добавляю новый элемент в список, я должен транзакционно увеличить соответствующий счетчик.
Я пытался сделать это, используя EntityListener:
class MyBrokenEntityListener {
@PostPersist
public void incrementCounter(Friendship friendship) {
friendship.getUser1().incrementFriendsCount();
}
}
Слушатель сущности вызывается правильно, и во время отладки я вижу, что он правильно изменяет сущность. Однако Hibernate не отправляет запрос UPDATE в базу данных, только запрос INSERT (соответствующий сущности Friendship).
Я пробовал разные события на EntityListener, но, похоже, он не работает.
Я предполагаю, что здесь происходит то, что прослушиватель сущности запускается обновлением пользователя. Затем он идентифицирует все грязные свойства пользователя, которые состоят только из списка. Поэтому он не имеет ничего общего с Пользователем, он должен только вставить дружбу. Затем она каскадно переходит в Дружбу. Слушатель объекта вызывается, он изменяет пользователя, но в это время Hibernate уже определил, что ему не нужно беспокоиться о пользователе, поэтому он не обновляет пользователя.
Правильно ли это рассуждение?
Если так, как я могу должным образом добиться этого?
Спасибо,
Bruno