如何在EJB 3.0 Entity Bean(JPA)中創建單向關係?Entity Bean(JPA)中的單向關係
例如,客戶瞭解訂單,但Order對於客戶沒有任何方法。 使用(@OneToMany或@OneToOne或@ManyToMany)
問候
如何在EJB 3.0 Entity Bean(JPA)中創建單向關係?Entity Bean(JPA)中的單向關係
例如,客戶瞭解訂單,但Order對於客戶沒有任何方法。 使用(@OneToMany或@OneToOne或@ManyToMany)
問候
這裏是你會怎麼做使用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 | |
+----------+---------+------+-----+---------+-------+
離開「單向」一旁的那一刻,人們可以如下模型的客戶訂單的關係。
@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對象,但生成的數據庫結構將是相同的(忽略列名稱中的細微差異)。您始終可以通過查詢查找給定訂單的客戶。
正如我在我的評論中寫的那樣,得到的數據庫結構**不會與JPA 1.0相同,JPA 1.0需要一個'JoinTable'來表示一個單向的'OneToMany'。 – 2010-08-18 22:29:01
閱讀完您的答案之後,我更新了我正在使用您在示例中提到的標記的項目中的一些實體。它的功能很好 - 數據庫結構相同,子類不包含對父類的直接引用。我不需要@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
是的,這完全是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
請注意,JPA 1.0不**支持單向'OneToMany'關係**而沒有** JoinTable'。換句話說,你不能將上面的表模型與單向的'OneToMany'映射,因此它不能準確地說明你的答案。 – 2010-08-18 20:47:40
帕斯卡是正確的。上述示例僅適用於JPA 2.0。 – 2010-08-18 20:52:04
@JoinColumn(name =「cust_id」,referencedColumnName =「owner_id」)是對的嗎? – uuidcode 2015-11-26 01:09:49