实体Bean中的单向关系(JPA)

时间:2010-08-18 19:10:55

标签: java orm jpa

如何在EJB 3.0 Entity-Beans(JPA)中创建单向关系?

例如,客户了解订单,但订单没有客户的任何方法。 使用(@OneToMany或@OneToOne或@ManyToMany)

此致

2 个答案:

答案 0 :(得分:15)

以下是使用JPA 2.0建立单向@OneToMany关系的方法:

@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    |       |
+----------+---------+------+-----+---------+-------+

答案 1 :(得分:1)

暂时搁置“单向”,可以按如下方式建立客户订单关系模型。

@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”列,其中包含Customer表的“id”列的外键。 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类,其中没有直接方式从Order对象获取Customer对象,但生成的数据库结构将是相同的(忽略细微差别)在列名中)。您始终可以通过查询找到给定订单的客户。