Как сделать однонаправленные отношения в Entity-Beans EJB 3.0 (JPA) )?
Например, Заказчик знает о Заказе, но Заказ не имеет метода для Заказчика. using (@OneToMany, @OneToOne или @ManyToMany)
С уважением
Вот как можно создать однонаправленную @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 | |
+----------+---------+------+-----+---------+-------+
Оставив на время в стороне "однонаправленность", можно смоделировать отношения заказчик-заказ следующим образом.
@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;
// ...
}
Здесь я предполагаю, что каждый заказ имеет ровно одного клиента. В базе данных таблица Order будет иметь столбец "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 содержит коллекцию заказов, на самом деле это никак не влияет на структуру базы данных; это просто удобный способ получения/управления заказами, принадлежащими клиенту. Например, вы можете вообще отказаться от члена "orders" в Customer и вместо этого использовать запросы для получения этих записей.
Я пытаюсь сказать, что с точки зрения базы данных не существует такой вещи, как "однонаправленные" отношения. Пример, приведенный reverendgreen, приведет к созданию Java-классов, где нет прямого способа получить объект Customer из объекта Order, но результирующая структура базы данных будет идентичной (не обращая внимания на незначительные различия в именах столбцов). Вы всегда можете найти клиента для данного заказа с помощью запроса.