2010-08-18 27 views
6

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

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

问候

回答

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

请注意,JPA 1.0不**支持单向'OneToMany'关系**而没有** JoinTable'。换句话说,你不能将上面的表模型与单向的'OneToMany'映射,因此它不能准确地说明你的答案。 – 2010-08-18 20:47:40

+0

帕斯卡是正确的。上述示例仅适用于JPA 2.0。 – 2010-08-18 20:52:04

+0

@JoinColumn(name =“cust_id”,referencedColumnName =“owner_id”)是对的吗? – uuidcode 2015-11-26 01:09:49

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; 
    // ... 
} 

这里我假设每个订单都有一个客户。在数据库中,订单表将包含一个“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类包含订单集合,但它实际上并未以任何方式影响数据库结构;这只是检索/管理属于客户的订单的便捷方式。例如,您可以从客户处完全删除“orders”成员,并依靠查询来提取这些记录。

我想说的是,从数据库的角度来看,确实没有像“单向”关系那样的东西。提供的示例reverendgreen将生成Java类,其中没有直接方式从Order对象获取Customer对象,但生成的数据库结构将是相同的(忽略列名称中的细微差异)。您始终可以通过查询查找给定订单的客户。

+0

正如我在我的评论中写的那样,得到的数据库结构**不会与JPA 1.0相同,JPA 1.0需要一个'JoinTable'来表示一个单向的'OneToMany'。 – 2010-08-18 22:29:01

+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规范的一个例子吗? – 2010-08-19 16:54:39

+0

是的,这完全是Hibernate特有的,**标准** JPA 1.0中'OneToOne'不允许'JoinColumn'。我在[@OneToMany中提供了相关引用,没有反向关系,也没有连接表?](http://stackoverflow.com/questions/2095998/onetomany-without-inverse-relationship-and-without-a-join-table/3517474 #3517474) – 2010-08-21 14:39:44