Отношение 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.

Другие вопросы по тегам