13.Что такое владелец связи?

13.Что такое владелец связи?

UNKNOWN

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

Владелец связи и владеемый

По сути, у кого есть внешний ключ на другую сущность - тот и владелец связи. То есть,  если  в  таблице одной  сущности  есть  колонка,  содержащая внешние  ключи  от  другой сущности, то первая сущность признаётся владельцем связи, вторая сущность - владеемой.

В однонаправленных отношениях сторона, которая имеет поле с типом другой сущности, является владельцем этой связи по умолчанию, например:

@Entity

public class LineItem {

    @Id

    private Long id

    @OneToOne

    private Product product;

}

@Entity

public class Product {

    @Id

    private Long id

    private String name;

    private Double price;

}

В этом примере владельцем является сущность LineItem, так как она имеет поле типа  Product.  А  Product  ничего  не  знает  о  LineItem,  так  как  не  имеет  такого  поля.

Получается, что в таблице LineItem есть колонка с внешним ключом на таблицу Product, а в таблице Product колонки LineItem нет.

Двунаправленные отношения имеют как сторону-владельца, так и владеемую сторону:

@Entity

public class CustomerOrder {

    @Id

    private Long id

    @OneToMany(mappedBy = \"customerOrder\")

    private Set<LineItem> lineItems = new HashSet<>();

}

@Entity

public class LineItem {

    @Id

    private Long id

    @OneToOne

    private Product product;  37

    @ManyToOne

    private CustomerOrder customerOrder;

}

В данном примере владельцем связи является сторона LineItem, потому что в таблице LineItem есть колонка с внешними ключами на таблицу CustomerOrder. Да и по правилам Java, сторона @ManyToOne всегда является владельцем связи, а элемент mappedBy определяет поле в объекте, который является владельцем отношения.

Тут так и получается: сторона @ManyToOne - LineItem; элемент mappedBy определяет поле \"customerOrder\" в объекте LineItem.

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

Владельца  связи  и  владеемого  легко  спутать  с  родителем  отношения  и ребенком.  В  нашем  случае  CustomerOrder  является  владеемым  и  одновременно родителем в отношениях, а LineItem является владеющим и одновременно ребенком в отношениях.

Родительская сущность (таблица)

Это  сущность  (таблица),  на  которую  ссылается  внешний  ключ  из  дочерней сущности (таблицы).

Дочерняя сущность (таблица)

Это  сущность  (таблица),  в  которой  есть  колонка  с  внешним  ключом, ссылающимся на родительскую сущность (таблицу).


Предыдущий вопрос: 12. Какие существуют виды связей?

Следующий вопрос: 14. Что такое каскадные операции?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне

Report Page