Однонаправленные отношения в Entity-Bean (JPA)

Как сделать однонаправленные отношения в Entity-Beans EJB 3.0 (JPA) )?

Например, Заказчик знает о Заказе, но Заказ не имеет метода для Заказчика. using (@OneToMany, @OneToOne или @ManyToMany)

С уважением

6
задан Pascal Thivent 19 August 2010 в 00:26
поделиться

2 ответа

Вот как можно создать однонаправленную @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    |       |
+----------+---------+------+-----+---------+-------+
15
ответ дан 8 December 2019 в 14:38
поделиться

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

@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, но результирующая структура базы данных будет идентичной (не обращая внимания на незначительные различия в именах столбцов). Вы всегда можете найти клиента для данного заказа с помощью запроса.

1
ответ дан 8 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: