JPA: лучшие практики с однонаправленным OneToMany - PullRequest
2 голосов
/ 03 июня 2011

У меня есть несколько небольших вопросов о передовых практиках с JPA (через hibernate).

Мой первый вопрос касается сложности модели одного домена.У меня есть модель учетной записи, которая представляет ... учетную запись;) У учетной записи много связей с другими объектами.Многие из них должны быть известны объекту Account, но некоторые из них должны быть известны только для другой части.

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

Итак, я сопоставил отношение с отношением ManyToOne только в классе Message, а не в Account.

Считаете ли вы хорошей практикой избегать слишком большого количества отношений вмодель класса (аккаунт в моем случае)?Или вы думаете, что я должен сопоставить ВСЕ отношения с учетной записью в моем классе учетной записи.Итак, какова лучшая практика, однонаправленные или двунаправленные отношения?

Мой второй вопрос касается однонаправленного случая.Когда я удаляю учетную запись из-за однонаправленной связи, все сообщения, ссылающиеся на эту учетную запись, теперь не удалось загрузить, поскольку родительская учетная запись отсутствует.

Как лучше всего поддерживать не поврежденную базу данных?- удалить все отношения при удалении учетной записи (может быть очень опасно с точки зрения производительности) - создать работу, которая постепенно удаляет все отношения и деактивирует учетную запись во время этого процесса

Спасибо за все предложения;)

1 Ответ

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

Вы можете без проблем использовать однонаправленные отношения, если вам не нужно переходить от учетной записи к ее сообщениям (в коде или в запросах).

Какое бы решение вы ни выбрали, вы должны определить ограничение внешнего ключа между сообщением и его учетной записью. Таким образом, удаление учетной записи без предварительного удаления ее сообщений приведет к исключению. Таким образом вы гарантируете, что согласованность данных не будет повреждена. Если вы хотите иметь возможность удалить учетную запись, не удаляя ее сообщения, то сначала вы должны отсоединить учетную запись от ее сообщений, установив для поля учетной записи ManyToOne значение null. Конечно, отношение должно быть помечено как необязательное, а столбец переднего ключа должен иметь значение NULL.

Обратите внимание, что наличие связи между учетной записью и ее сообщениями (даже если она недоступна из остального кода) позволит вам

  • использовать это отношение внутри запросов
  • установить каскадное удаление в отношении, чтобы все сообщения автоматически удалялись до удаления учетной записи.
...