2016-07-15 5 views
0

У меня сценарий:
У меня возникли проблемы, выясняя, что такое сторона владельца и почему? Пожалуйста, помогите?Сторона владельца с аннотацией JoinColumns

public class Basket 
{ 

... 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumns({@JoinColumn(name="BASKET", referencedColumnName="ID")}) 
    public Set<Product> getProductList() { 
     return this.productList; 
    } 
} 

public class Product 
{ 

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH) 
    @JoinColumns({@JoinColumn(name="BASKET", referencedColumnName="ID")}) 
    public Basket getBasket() { 
     return this.basket; 
    } 

} 
+0

Почему?'@JoinColumns ({@ JoinColumn (name =" BASKET ", referedColumnName =" ID ")})' просто '@JoinColumn (name =" BASKET ", referedColumnName =" ID ")' – Ice

+0

Я не знаю, м, пытаясь понять, что это тоже хорошо. Я унаследовал эту форму кода у других – GionJh

ответ

0

Корзина является «одной» стороной отношений и существует множество продуктов, обозначенных как корзины. Таким образом, «один» обычно является родительским кодом, а дочерние записи ссылаются на родителя. Обычно самый простой способ понять это - посмотреть на ограничение внешнего ключа базы данных (надеюсь, есть одно), которое связывает таблицы поддержки.

0

Один клиент имеет одну корзину и одна корзина имеет один владелец, так:

class Owner имеет корзины в отношении @OneToOne.

Одна корзина имеет много продуктов, так:

class Basket имеет список продуктов в отношении @OneToMany.

Многие продукты имеет одну корзину так:

class Product имеет отношение в @ManyToOne.

0

Экстракт из JPA 2.0 specification может помочь вам разобраться в вопросе:

2.10.2Bidirectional ManyToOne/OneToMany отношения

Если предположить, что:

Entity A references a single instance of Entity B. 
    Entity B references a collection of Entity A[21]. 

Предприятие А должно быть владельцем отношений.

Следующие значения по умолчанию отображение относятся:

Entity A is mapped to a table named A. 
Entity B is mapped to a table named B. 

Таблица A содержит внешний ключ к таблице В. Имя ключа внешней колонки формируется как конкатенация следующее: имя свойства отношений или поля объект A; "_"; имя столбца первичного ключа в таблице B. Ключ столбец внешнего имеет тот же тип, что и первичный ключ таблицы B.

А в разделе 11.1.21 следующее сказано:

Если имеется более одного столбца объединения, для каждого столбца объединения необходимо указать аннотацию JoinColumn, используя аннотацию JoinColumns. И имя, и ссылочные элементыColumnName должны указываться в каждой аннотации JoinColumn.

В вашем случае имеется только одна колонка соединения. Поэтому вам не нужно аннотировать @JoinColumns. Просто используйте @JoinColumn. Аннотации @JoinColumn всегда используются на стороне отношения, то есть стороны @ManyToOne в этом случае.

+0

спасибо, но я думаю, что используя эти аннотации, как в моем примере, один из них - владелец, я хотел бы понять, почему? – GionJh

+0

Сторона OneToMany не может быть владельцем отношений. Владелец всегда тот, где вы поместили свой внешний ключ в условия базы данных. Вы не можете поместить внешний ключ на стороне «Один»; если вы это сделаете, у вас будет несколько значений для одной записи в базе данных. Я не пытаюсь вас убедить; Я просто рассказываю вам, как структура обрабатывает отношения и как должна создаваться база данных, если она должна соответствовать парадигме реляционной базы данных. – ujulu

+0

Прошу прощения, я не думаю, что вы правы. Http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ – GionJh

Смежные вопросы