Наше Java-приложение имеет около 100 классов, сопоставленных с базой данных (SQL Server или MySQL). Мы используем Hibernate как наш ORM (с файлами сопоставления XML).Кэш второго уровня для спящего режима и ON DELETE CASCADE в схеме базы данных
В нашей схеме базы данных указываются ограничения FOREIGN KEY
. В большинстве наших ограничений FOREIGN KEY
также указывается ON DELETE CASCADE
.
Мы недавно начали включать кэширование второго уровня Hibernate (для популярных объектов и коллекций), чтобы уменьшить некоторые проблемы с производительностью.
Производительность улучшилась, так как мы включили кеш второго уровня. Однако мы также начали сталкиваться с ObjectNotFoundExceptions.
Кажется ObjectNotFoundExceptions являются происходя, потому что база данных удаление строк таблицы под гибернации. Например, когда мы удаляем Parent
с Hibernate, схема базы данных будет ON DELETE CASCADE
любым объектам Child
. Это, очевидно, происходит без знания Hibernates, поэтому у него нет возможности обновлять кеш второго уровня (и удалять любые удаленные объекты Child
).
Мы уверены, что решение этой проблемы - удалить ON DELETE CASCADE
из нашей схемы базы данных (но сохранить FOREIGN KEY
). Вместо этого нам нужно настроить Hibernate для удаления зависимостей Child
с обычным удаленным SQL, который также сделает Hibernate обновлением кеша второго уровня. Некоторое ограниченное тестирование показало, что этот подход, похоже, работает.
Я хотел получить некоторые отзывы сообщества об этом. Существуют ли альтернативные (лучше?) Решения нашей проблемы? Как другие справляются с этой ситуацией? В общем, каковы компромиссы, которые следует учитывать при использовании ON DELETE CASCADE
в схеме базы данных с Hibernate?
Спасибо.
Хорошего момент. База данных доступна и обновляется кодом Java в нашем приложении. Эта ситуация вряд ли изменится. Поэтому удаление ON DELETE CASCADE не повлияет на другие приложения/скрипты и т. Д. –
Затем перейдите и сделайте это с помощью hibernate – bwawok
Почему бы не оставить базу данных 'ON DELETE CASCADE' в сочетании с hibernate delete cascade? база данных удаляет ее, hibernate пытается удалить каскадированные дочерние элементы, но ничего не удалять. Так что ничего не должно произойти, или я ошибаюсь? – djmj