Наше Java-приложение имеет около 100 классов, сопоставленных с базой данных (SQL Server или MySQL).Мы используем Hibernate в качестве нашего ORM (с файлами отображения XML).
Мы указываем ограничения FOREIGN KEY
в нашей схеме базы данных.В большинстве наших FOREIGN KEY
ограничений также указывается ON DELETE CASCADE
.
. Недавно мы начали включать кэширование Hibernate 2-го уровня (для популярных объектов и коллекций), чтобы уменьшить некоторые проблемы с производительностью.улучшилось, так как мы включили кэш 2-го уровня.Однако мы также начали сталкиваться с ObjectNotFoundExceptions.
Кажется, что ObjectNotFoundExceptions происходят, поскольку база данных удаляет строки таблицы под Hibernate.Например, когда мы удаляем Parent
с Hibernate, схема базы данных будет ON DELETE CASCADE
для любых Child
объектов.Это очевидно происходит без знания Hibernates, поэтому у него нет возможности обновить кэш 2-го уровня (и удалить все удаленные Child
сущности).
Мы считаем, что решение этой проблемы заключается в удалении ON DELETE CASCADE
из нашей схемы базы данных (но оставьте FOREIGN KEY
s).Вместо этого нам нужно настроить Hibernate на удаление Child
зависимостей с помощью обычного SQL для удаления, что также заставит Hibernate обновить кэш 2-го уровня.Некоторое ограниченное тестирование показало, что этот подход, похоже, работает.
Я хотел бы получить отзывы сообщества по этому поводу.Есть ли альтернативные (лучшие?) Решения нашей проблемы?Как другие справляются с этой ситуацией?В общем, какие компромиссы следует учитывать при использовании ON DELETE CASCADE
в схеме базы данных с Hibernate?
Спасибо.