2010-08-18 53 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