Разница между @JoinColumn и mappedBy

Разница между @JoinColumn и mappedBy

1. Вступление

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

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

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

  • владеющая сторона

  • обратная сторона или сторона ссылки

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

В этом кратком руководстве мы рассмотримthe difference between @JoinColumn and mappedByin JPA. We’ll also present how to use them in a one-to-many association.

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

Чтобы следовать этому руководству, допустим, у нас есть две сущности:Employee иEmail..

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

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

image

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

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

В отношениях «один-ко-многим / многие-к-одному»the owning side is usually defined on the ‘many' side of the relationship. Обычно это сторона, которая владеет внешним ключом.

Аннотация@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. Итак, давайте определим нашу сущностьEmployee:

@Entity
public class Employee {

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

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

    // ...
}

Здесьthe value of mappedBy is the name of the association-mapping attribute on the owning side.. Таким образом, мы установили двунаправленную связь между нашими объектамиEmployee иEmail.

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

В этом руководстве мы рассмотрели разницу между@JoinColumn иmappedBy и то, как их использовать в двунаправленной связи «один ко многим».

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

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