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. Что такое каскадные операции?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне