Связь вида многие-ко-многим между сущностями проще всего организовать через промежуточную сущность. Такой подход соответствует тому, как создаются связи многие-ко-многим между таблицами в БД. Связующая таблица в таком случае помимо колонок, ссылающихся, на связываемые таблицы, также может иметь любые другие дополнительные колонки.
Читать далееАрхив метки: @jakarta.persistence.OneToMany
Использование отображений (Map) для связи @OneToMany один-ко-многим между сущностями
При создании связи один-ко-многим между сущностями в качестве коллекции, ссылающейся на сущности, которых «много», помимо обычных списков (List) и множеств (Set), также можно использовать отображения (Map). Это позволяет значения любого (обычно уникального) поля вынести в ключ отображения, а в значение положить саму сущность. Что бывает удобно при некоторых обстоятельствах.
Читать далееСвязь @OneToMany между @Embeddable и @Entity классами в Hibernate
Встраиваемый (@Embeddable) класс может содержать поле со списком объектов класса-сущности (@Entity). При этом у данных встраиваемого класса нет своей таблицы и они, как и положено, хранятся в таблице какой-то ещё сущности. Такая организация приводит к возникновению связи один-ко-многим между таблицами классов сущностей, которые в коде напрямую друг с другом не связаны.
Например, если у нас класс-сущность Company, содержащий поле встраиваемого класса Address при этом в классе Address есть поле List<Person> owners, где Person это в свою очередь класс-сущность, то между таблицами COMPANY и PERSON создаётся связь один-ко-многим, хотя между классами Company и Person прямой связи нет.
Читать далееДвунаправленная связь @OneToMany через таблицу (@JoinTable) в Hibernate
В JPA/Hibernate есть несколько способов описания двунаправленной связи между сущностями. Одним из которых является связь через третью таблицу. Если сущности слабо связаны друг с другом и связи между ними не постоянны, то такой подход подход позволяет избежать null значений в таблицах.
Например, если у нас есть две сущности: Person и Email, которые достаточно независимы друг от друга в том смысле, что не за каждым человеком закреплён адрес почты, а также не про каждый адрес известно чей он, то при создании связи через простой внешний ключ некоторые поля будут содержать null. Если такая ситуация недопустима, то организация связи через третью таблицу, эту проблему решает. Цена решения — затраты на join’ы при выборке.
Читать далееОднонаправленная связь @OneToMany между сущностями в Hibernate
Создание связи один-ко-многим является типичной задачей. Главным отличием описания такой связи в JPA/Hibernate от описания в БД заключается в том, что если в БД мы всегда описываем связь в ссылающейся таблице, то в Hibernate — это можно сделать в той сущности, на которую ссылаются.
Например, допустим у нас есть человек и у него есть адреса электронной почты. Тогда в БД в таблице EMAIL мы опишем колонку с внешним ключом на таблицу PERSON. Hibernate же позволяет в классе Person создать поле List<Email> emails и, аннотировав его должным образом, описать аналогичную связь. Класс Email же будет описан таким образом, как будто бы он вообще никак не связан с классом Person. Хотя в БД мы по-прежнему получим таблицу EMAIL с внешним ключом на PERSON.
Читать далееИспользование настройки orphanRemoval для автоматического удаления из БД строк, когда соответствующие им объекты удаляются из поля-коллекции родительского объекта в Hibernate
При создании двунаправленной связи между двумя классами-сущностями мы должны самостоятельно управлять жизненными циклами объектов каждого класса. Однако, если объекты дочернего класса используются только в полях типа Collection родительского класса, то с помощью настройки orphanRemoval можно указать Hibernate’у удалять из БД строки с данными дочернего класса, при удалении объектов из этой коллекции.
Например, если в классе Person есть поле List и между классами Person и Address установлена двунаправленная связь, то можно настроить автоматическое удаление строк из таблицы Address при удалении соответствующих объектов из List.
Читать далееАвтоматическое удаление связанных классов-сущностей при удалении родительского объекта с помощью настройки CascadeType.REMOVE в Hibernate
При создании двунаправленной связи между двумя классами-сущностями мы должны самостоятельно управлять жизненными циклами объектов каждого класса, в том числе удалением строк из БД. С помощью настройки CascadeType.REMOVE в Hibernate можно избавиться от иногда рутинной операции удаления дочерних сущностей сразу после удаления родительской.
Читать далееАвтоматическое сохранение состояния связанных классов-сущностей при сохранении состояния родительского объекта с помощью настройки CascadeType.PERSIST в Hibernate
При создании двунаправленной связи между двумя классами-сущностями мы должны самостоятельно управлять жизненными циклами объектов каждого класса, в том числе сохранением строк в БД. С помощью настройки CascadeType.PERSIST в Hibernate можно избавиться от иногда рутинной операции сохранения дочерних сущностей сразу после сохранения родительской.
Читать далееСоздание двунаправленной связи между классами-сущностями с помощью аннотаций @ManyToOne и @OneToMany в Hibernate
Одной из сильных сторон объектного моделирования предметной области заключается в возможности создавать двунаправленные связи между родительскими и дочерними объектами. Так, если пользователю может соответствовать несколько адресов, то не только класс Address будет содержать поле Person, к которому конкретный адрес относится, но и класс Person может содержать список типа Address со всеми относящимися к нему адресами.
В реляционных базах данных невозможно точно воспроизвести такие отношения. Но Hibernate снимает это несоответствие, позволяя разработчику создавать двунаправленные отношения в объектной модели в Java, продолжая сохранять данные в реляционной модели в БД.
Читать далееУстановка опции ON DELETE CASCADE на внешний ключ таблицы, ссылающейся на родительскую с помощью настройки OnDeleteAction.CASCADE в Hibernate
Hibernate позволяет настроить на уровне БД каскадное удаление данных дочерних таблиц, при удалении строки родительской таблицы. Поскольку не все СУБД поддерживают данных функционал, то его использование может отразиться на переносимости приложения между разными СУБД.
Читать далее