[英]Cascade delete and one-to-one mapping in hibernate
在為買家創建銷售訂單賬單的 web 應用程序中,我嘗試創建數據庫表和 hibernate 映射。 實體之間的關系是:
一個 Bill 有一個 Buyer 和一個 SaleOrder
SaleOrder 有一個買家。
刪除 SaleOrder 時,必須刪除關聯的 Bill。
我實現了 java 類,創建了表。
在模式中,表 SALEORDER 有一個 FK 列“BUYER_ID”。 此表沒有其他外鍵列。 表 BILL 有兩個外鍵,BUYER_ID 和 SALEORDER_ID。
我如何使用一對一的關系map Bill 和 SaleOrder 並確保在刪除 SaleOrder 時,Bill 也被刪除?
我很困惑,因為 SaleOrder 表沒有名為 INVOICE_ID 的外鍵,我如何在 SaleOrder.hbm.xml 中進行 map 以下操作?
<!-- 1-to-1 modelled using n-to-n + unique -->
<many-to-one name="invoice" class="Invoice" column="INVOICE_ID" cascade="delete" unique="true">
</many-to-one>
如果我只將映射放在 Bill.hbm.xml 中,我是否可以提及級聯刪除(刪除 SaleOrder 時應該刪除 Bill)?
希望有人可以提出解決方案。
我的應用程序中的類是:
class Buyer{
private Long buyerId;
private String name;
...
}
class SaleOrder{
private Long saleOrderId;
...
private Buyer buyer;
...
}
class Bill{
private Long billId;
...
private Buyer buyer;
private SaleOrder saleOrder;
...
}
架構是:
CREATE TABLE BUYER(
BUYER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
NAME VARCHAR(100)
);
CREATE TABLE SALEORDER(
SALEORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
);
CREATE TABLE BILL(
BILL_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
SALEORDER_ID BIGINT NOT NULL,
);
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_SO FOREIGN KEY(SALEORDER_ID) REFERENCES SALEORDER(SALEORDER_ID);
讓我使用注釋回答您的問題,XML 配置對我來說似乎有點過時。 解決方案是在 Bill 中不保留任何引用。 但是 SaleOrder 將使用關系定義上方的 CascadeType.DELETE_ORPHAN 對 Bill 和 Buyer 持有對 SaleOrder 的 1-n 引用的 1-1 引用。 因此,當一個 SaleOrder 被刪除時,底層的 Bill 被刪除,而當一個 Buyer 被刪除時,底層的 SaleOrder 和它們底層的 Bill 也被刪除。
class Bill{
private Long billId;
...
}
class SaleOrder{
private Long saleOrderId;
...
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Cascade( {org.hibernate.annotations.CascadeType.DELETE_ORPHAN} )
private Bill bill;
...
}
class Buyer {
private Long buyerId;
private String name;
...
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Cascade( {org.hibernate.annotations.CascadeType.DELETE_ORPHAN} )
private List<SaleOrder> saleOrders;
...
}
您必須對您的DAO進行編碼,以獲取針對 SaleOrder 的買方和針對賬單的 SaleOrder。 這當然是另一個問題,如何做到這一點。 但是你應該在上面找到好書和 web 資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.