在hibernate中级联删除和一对一映射

时间:2011-07-22 08:32:31

标签: java hibernate cascade

在为买方创建Bill for SaleOrder的Web应用程序中,我尝试创建数据库表和休眠映射。实体之间的关系是:

  
      
  1. Bill有买方和SaleOrder

  2.   
  3. SaleOrder有买家。

  4.   
  5. 删除SaleOrder时,必须删除相关的帐单。

  6.   

我实现了java类,创建了表。

在架构中,表SALEORDER有一个FK列'BUYER_ID'。 此表没有其他外键列。 表BILL有两个外键,BUYER_ID和SALEORDER_ID。

如何使用一对一关系映射Bill和SaleOrder AND 确保删除SaleOrder时,还会删除该帐单?

我很困惑因为,因为SaleOrder表没有名为INVOICE_ID的外键,我如何在SaleOrder.hbm.xml中映射以下内容?

<!-- 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中,我是否可以提及 cascade delete (删除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);

1 个答案:

答案 0 :(得分:1)

让我用注释回答你的问题,XML配置对我来说似乎有些过时了。解决方案是在Bill中没有引用。但SaleOrder将使用CascadeType.DELETE_ORPHAN在关系定义之上,对Bill和买方提供1-n引用SaleOrder的1-1引用。因此,当删除SaleOrder时,基础账单将被删除,当删除买方时,基础SaleOrder和基础账单将被删除。

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的帐单。这当然是另一个问题,如何做到这一点。但你应该在上面找到好书和网络资源。