Отношение ManyToOne без списка / набора с использованием JPA
У меня есть новый проект JPA, использующий hibernate, и я сталкиваюсь с трудностями при чтении его кода. Я видел:
@Entity
public class Product {
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Manufacturer manufacturer;
...
}
и другой субъект
@Entity
public class Manufacturer{
private ManufacturerId manufacturerId;
private String name;
private Manufacturer() {
}
...
Почему в классе Entity Entity отсутствует Список / Набор с продуктом (ами)? Отношения ManyToOne двунаправлены? Почему это возможно? Как производитель узнает о своей продукции, как это будет сохраняться в таблице БД?
2 ответа
Многоликая связь один ко многим является необязательной. Вы можете реализовать его, если задумано, или пропустить его, если не нужно или даже рискованно. У производителя может быть много тысяч продуктов. Чем нет смысла забирать их всех сразу. Лучше загружать с помощью запроса и использовать пейджинг. Конечно, вы можете добавить коллекцию продуктов вашему производителю, если считаете, что это вам поможет.
Почему в классе Entity Entity отсутствует Список / Набор с продуктом (ами)?
Либо потому, что не нужен, либо считается рискованным.
Отношения ManyToOne двунаправлены?
Конечно да. Даже если отношения не реализованы, они все еще существуют.
Почему это возможно? Как это будет сохраняться в таблице БД?
Отношения OneToMany всегда реализуются с помощью идентификатора с одной стороны. (В этом случае в идентификаторе производителя указан идентификатор продукта. Больше ничего не нужно. Даже если вы реализуете коллекцию продуктов. Это не повлияет на то, как она сохраняется)
Как производитель узнает о своей продукции?
Это не так. Но, конечно, можно запросить базу данных.
Если вы посмотрите на это на уровне БД, таблица Product
будет что-то вроде manufacturer_id
который является внешним ключом к Manufacturer
Таблица. Структура таблицы остается одинаковой как в случае однонаправленного, так и двунаправленного отображения.
Производитель узнает свой продукт, запросив таблицу Product
с manufacturer_id = <its id>
, На уровне JPA, в случае однонаправленного отображения, вы можете запросить его по from Product p where p.manufacturer.id = :man_id
, В случае двунаправленного картирования вы можете просто сделать manufacturer.getProducts()
, но это будет перевод на тот же SQL.