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