Рубрики
Без рубрики

Разница между @JoinColumn и отображением по

Узнайте о разнице между @JoinColumn и mapped By и о том, как использовать их в двунаправленных отношениях “один ко многим”.

Автор оригинала: Shubhra Srivastava.

1. введение

Отношения JPA могут быть как однонаправленными, так и двунаправленными. Это просто означает, что мы можем смоделировать их как атрибут только для одного из связанных объектов или для обоих.

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

Для двунаправленных отношений мы обычно определяем:

  • сторона-собственник
  • обратная или ссылочная сторона

Аннотация @JoinColumn помогает нам указать столбец, который мы будем использовать для присоединения к ассоциации сущностей или коллекции элементов. С другой стороны, атрибут mappedBy используется для определения стороны ссылки (стороны, не являющейся владельцем) отношения.

В этом кратком руководстве мы рассмотрим разницу между @JoinColumn и , отображаемой | в JPA. Мы также расскажем, как использовать их в ассоциации “один ко многим”.

2. Начальная настройка

Чтобы следовать этому учебнику, предположим, что у нас есть две сущности: Сотрудник и Электронная почта.

Очевидно, что у сотрудника может быть несколько адресов электронной почты. Однако данный адрес электронной почты может принадлежать только одному сотруднику.

Это означает, что они разделяют ассоциацию “один ко многим”:

Также в нашей модели СУБД у нас будет внешний ключ employee_id в нашей электронной почте сущности, ссылающейся на атрибут id сотрудника .

3. Аннотация @JoinColumn

В отношениях “Один ко многим”/”Многие к одному” сторона владения обычно определяется на стороне “ многие “ отношений. Обычно это сторона, которой принадлежит внешний ключ.

Аннотация @JoinColumn определяет фактическое физическое отображение на стороне владельца:

@Entity
public class Email {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    // ...

}

Это просто означает, что наша сущность Email будет иметь столбец внешнего ключа с именем employee_id , ссылающийся на основной атрибут id нашей сущности Employee .

4. Атрибут mappedBy

Как только мы определили сторону владения отношениями, Hibernate уже имеет всю информацию, необходимую для отображения этих отношений в нашей базе данных. Чтобы сделать эту ассоциацию двунаправленной, все, что нам нужно сделать, это определить сторону ссылки. Обратная сторона или сторона ссылки просто сопоставляется с стороной владельца.

Для этого мы можем легко использовать атрибут mappedBy аннотации @OneToMany . Итак, давайте определим наш Сотрудник объект:

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
    private List emails;
    
    // ...
}

Здесь значение mappedBy – это имя атрибута сопоставления ассоциаций на стороне владельца. С помощью этого мы теперь установили двунаправленную связь между нашими Сотрудниками и Электронной почтой сущностями.

5. Заключение

В этом уроке мы рассмотрели разницу между @JoinColumn и , отображенными , и как использовать их в двунаправленных отношениях “один ко многим”.

Аннотация @JoinColumn определяет фактическое физическое отображение на стороне владельца. С другой стороны, сторона ссылки определяется с помощью атрибута mappedBy аннотации @OneToMany .

Как обычно, исходный код доступен на Github .