2015-01-12 4 views
3

У меня есть новый проект JPA с использованием спящего режима, и я сталкиваюсь с трудностями при чтении его кода. Я видел:ManyToOne отношение без списка/набора с использованием JPA

@Entity 
public class Product { 

    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Manufacturer manufacturer; 

... 
} 

и другой Entity

@Entity 
public class Manufacturer{ 

private ManufacturerId manufacturerId; 

    private String name; 

    private Manufacturer() { 
    } 
... 

Почему не Перечислите/Набор продукта (ы) в Производитель класса Entity? ManyToOne отношения двунаправленные? Почему это возможно? Как производитель знает о своих продуктах, как это будет сохраняться в таблице БД?

+0

Как производитель знает о своих товарах? Ваш вопрос отвечает на ваш вопрос. «Его», его продукт, поэтому он будет знать об этом. large имеет портфолио продуктов –

+0

ManyToOne является двунаправленным, если есть List/Set и однонаправленный, если есть нет. Что еще нужно сказать ... –

+0

@Xelian Вы можете получить списки продуктов из Java-кода без HQL? –

ответ

2

Многосторонняя связь от одного до другого является необязательной. Вы можете реализовать его, если хотите, или пропустить его, если это не нужно или даже рискованно. У производителя может быть много тысяч продуктов. Чем бессмысленно брать всех сразу. Лучше загружать с помощью запроса и использовать пейджинг. Конечно, вы можете добавить коллекцию продуктов своему производителю, если считаете, что это вам поможет.

  • Почему нет списка/набора с Продуктом (ами) в классе производителя?

    Либо потому, что не нужен, либо считается рискованным.

  • ManyToOne отношения двунаправленные?

    Конечно, да. Даже если связь не выполняется, она все еще существует.

  • Почему это возможно? Как это будет сохраняться в таблице БД?

    Отношения OneToMany всегда реализуются идентификатором с одной стороны. (ManufacturerId в продуктах в этом случае. Больше ничего не нужно. Даже если вы реализуете сбор продуктов. Это не влияет так, как это сохранялось.

  • Как производитель знает о своей продукции?

    Это не Но, конечно, можно запросить базу данных.

+0

Можете ли вы подробно объяснить, почему это отвечает на вопрос? Как бы то ни было, трудно понять, почему это правильное решение. – brandonscript

+0

@remus Да, было немного быстро с чтением. должно быть лучше сейчас. –

1

Если вы посмотрите на него на уровне DB, таблица Product будет иметь что-то вроде manufacturer_id, которая является внешним ключом для таблицы Manufacturer. Структура таблицы остается неизменной как в однонаправленном, так и в двунаправленном картографическом случае.

Производитель узнает о его продукте, запросив таблицу Product с manufacturer_id = <its id>. На уровне JPA в случае однонаправленного сопоставления вы можете запросить его на from Product p where p.manufacturer.id = :man_id. В случае двунаправленного сопоставления вы могли бы просто сделать manufacturer.getProducts(), но он перевел бы тот же SQL.