Hibernate - получение всех сущностей, на которые ссылаются внешние ключи для конкретной сущности - PullRequest
0 голосов
/ 17 июня 2011

У меня есть вопрос, похожий на этот:

Как найти все внешние ключи?

Я бы хотел, чтобы Hibernate сообщал мне, есть ли ссылка на сущность где-то в базе данных по внешним ключам. Предыстория такова: я хочу реализовать JIRA-подобное поведение в своем приложении: удалять только пользователя, если на него нет ссылок, а также отказываться от операции удаления.

Я знаю, что могут быть проблемы с производительностью, но прежде всего мне бы хотелось узнать, выполнимо ли это или вы можете придумать лучший способ добиться этого.

Один из способов сделать это - вызвать delete и перехватить следующие исключения, но я считаю, что должен быть лучший или более элегантный способ сделать это?

Привет, Chris

1 Ответ

2 голосов
/ 17 июня 2011

Hibernate не имеет понятия или осведомленности о внешних ключах MySQL. Вот некоторые варианты, которые я могу придумать:

  • Отобразите обе стороны отношений в Hibernate (убедитесь, что пометили их inverse=true, чтобы Hibernate не пытался использовать эту сторону для обновления базы данных). Затем, когда вы хотите удалить пользователя, просто убедитесь, что свойство .size() различных отношений равно 0. Я считаю, что это будет «типичное» решение Hibernate.
    • Минусы - Если у вас есть такая сторона отношений в ваших объектах, может возникнуть соблазн использовать ее. Двусторонние ассоциации могут быть сложными и должны быть хорошо поняты.
  • Запросить каждое отношение проверка, находится ли пользователь, которого вы пытаетесь удалить, в своем наборе. Это наименее навязчивый подход. Вы можете использовать запрос подсчета, чтобы избежать отправки сущностей в Java.
    • Минусы - это самый неэффективный подход.
  • Использовать собственный SQL Если вы попытаетесь удалить и поймать исключения, вы уже полагались бы на SQL (в некоторых базах данных отсутствует концепция внешних ключей). Вам лучше просто выполнить запрос в нативном SQL на этом этапе.
    • Минусы - это добавляет зависимость в вашей программе к SQL.
...