Установленные вами нетривиальные правила слишком сложны для Hibernate, чтобы их можно было обрабатывать «из коробки».
Я рекомендую использовать концепцию DDD Агрегаты и Агрегатные корни, чтобы разложить вашу модель, использовать каскад внутри Агрегатов и общаться с событиями между ними.
Я вижу два агрегата: User
и Conversation
. Агрегат Conversation
состоит из Conversation
в качестве корневого агрегата и Message
s в качестве дополнительных объектов.
Удалите список Message
s из User
и предоставьте вместо него методы поиска в ConversationRepository
.
Вся логика, которую вы описываете, заключается в методах User
, UserRepository
, Conversation
и ConversationRepository
. Классы User*
могут делегироваться ConversationRepository
для манипулирования Conversation
s и Message
s.
При таком подходе реализация желаемой логики должна быть проще для реализации, тестирования и понимания. Многие шаги могут быть проще (и, возможно, быстрее) реализованы с использованием прямого SQL вместо JPA. Конечно, вам нужно позаботиться о том, чтобы JPA-кэш 1-го уровня не устаревал.