2010-08-18 4 views

ответ

15

Вот как бы сделать однонаправленный @OneToMany отношения с помощью JPA 2.0:

@Entity 
public class Customer { 
    @Id 
    @Column(name="cust_id") 
    private long id; 
    ... 
    @OneToMany 
    @JoinColumn(name="owner_id", referencedColumnName="cust_id") 
    private List<Order> order; 
    ... 
} 

@Entity 
public class Order { 
    @Id 
    @Column(name="order_id") 
    private long id; 
    ... 
} 

Реляционная база данных:

Заказчик:

+---------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+---------+---------+------+-----+---------+-------+ 
| cust_id | int(11) | NO | PRI | NULL |  | 
+---------+---------+------+-----+---------+-------+ 

Заказ:

+----------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+----------+---------+------+-----+---------+-------+ 
| order_id | int(11) | NO | PRI | NULL |  | 
| owner_id | int(11) | NO | MUL | NULL |  | 
+----------+---------+------+-----+---------+-------+ 
+3

Обратите внимание, что JPA 1.0 не ** поддерживает ** однонаправленную связь OneToMany ** без ** 'JoinTable'. Другими словами, вы не можете сопоставить модель вышеприведенных таблиц с однонаправленным «OneToMany» и, таким образом, точно не показывать ваш ответ. –

+0

Паскаль прав. Вышеприведенный пример работает только для JPA 2.0. –

+0

@JoinColumn (name = "cust_id", referendedColumnName = "owner_id") прав? – uuidcode

1

Покидая "однонаправленный" в сторону на данный момент, можно моделировать отношения с клиентами-Order следующим образом.

@Entity 
public class Customer { 
    // ... 
    @Id @GeneratedValue 
    int id; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer") 
    Set<Order> orders; 
    // ... 
} 

@Entity 
public class Order { 
    // ... 
    @ManyToOne(optional = false) 
    Customer customer; 
    // ... 
} 

Здесь я предполагаю, что каждый заказ имеет ровно один Заказчик. В базе данных в таблице «Порядок» будет столбец «customer_id» с внешним ключом в столбец «id» таблицы Customer. DDL выглядел бы следующим образом.

CREATE TABLE Customer (
    id INT NOT NULL, 
    ... 
    PRIMARY KEY (id) 
); 

CREATE TABLE Order (
    ... 
    customer_id INT NOT NULL, 
    ... 
    FOREIGN KEY (customer_id) REFERENCES Customer (id) 
); 

Хотя класс Customer содержит набор заказов, это никак не влияет на структуру базы данных; это просто удобный способ получения/управления заказами, принадлежащими клиенту. Например, вы можете полностью отключить элемент «заказы» от клиента и полагаться на запросы для извлечения этих записей.

Пункт, который я пытаюсь сделать, состоит в том, что с точки зрения базы действительно нет такой вещи, как «однонаправленное» отношение. В примере reverendgreen предоставлены классы Java, где нет пути , чтобы получить объект Customer из объекта Order, но результирующая структура базы данных будет идентичной (игнорируя незначительные различия в именах столбцов). Вы всегда можете найти клиента для данного заказа с помощью запроса.

+0

Как я писал в своем комментарии, результирующая структура базы данных ** не будет ** идентична JPA 1.0, JPA 1.0 нуждается в «JoinTable» для представления однонаправленного «OneToMany». –

+0

После прочтения вашего ответа, я обновил некоторые объекты в проекте, над которым я работаю, чтобы использовать разметку, указанную в вашем примере. Он отлично работает - структура базы данных одинакова, а дочерние классы не содержат прямой ссылки на родительский класс. Мне не нужна аннотация @JoinTable. Зависимости следующим образом: hibernate-annotations 3.4.0.GA, hibernate-commons-annotations 3.1.0.GA, hibernate-core 3.3.2.GA, hibernate-entitymanager 3.4.0.GA, persistence-api 1.0. Это всего лишь случай, когда Hibernate выходит за рамки спецификации JPA 1.0? –

+0

Да, именно, это Hibernate specific, 'JoinColumn' не разрешено на' OneToOne' в ** стандартном ** JPA 1.0.Я предоставил соответствующие ссылки в [@OneToMany без обратной привязки и без таблицы соединений?] (Http://stackoverflow.com/questions/2095998/onetomany-without-inverse-relationship-and-without-a-join-table/3517474 # 3517474) –

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