JPA: лучшие практики с однонаправленным OneToMany

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

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

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

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

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

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

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

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


person Jerome Cance    schedule 03.06.2011    source источник


Ответы (1)


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

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

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

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