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



帐单有一个买方和一个销售订单
一个SaleOrder有一个买方。
删除销售订单后,必须删除关联的账单。



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

在模式中,表SALEORDER具有FK列“ BUYER_ID”。
该表没有其他外键列。
表BILL有两个外键,BUYER_ID和SALEORDER_ID。

如何使用一对一关系映射Bill和SaleOrder,并确保在删除SaleOrder时也删除了Bill?

我很困惑,因为,由于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中,是否可以提及级联删除(删除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中不保留任何引用。但是,使用关系定义上方的CascadeType.DELETE_ORPHAN,SaleOrder将保留对Bill的1-1引用,而买方将对SaleOrder的1-n引用保留。因此,当删除销售订单时,基础账单将被删除,而当买方被删除时,基础销售订单以及它们的基础账单将被删除。

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

10-07 13:21