如何在EJB 3.0 Entity-Beans(JPA)中创建单向关系?
例如,客户了解订单,但订单没有客户的任何方法。 使用(@OneToMany或@OneToOne或@ManyToMany)
此致
答案 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对象,但生成的数据库结构将是相同的(忽略细微差别)在列名中)。您始终可以通过查询找到给定订单的客户。