簡體   English   中英

hibernate中的級聯刪除和一對一映射

[英]Cascade delete and one-to-one mapping in hibernate

在為買家創建銷售訂單賬單的 web 應用程序中,我嘗試創建數據庫表和 hibernate 映射。 實體之間的關系是:

  1. 一個 Bill 有一個 Buyer 和一個 SaleOrder

  2. SaleOrder 有一個買家。

  3. 刪除 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM