在为买方创建Bill for SaleOrder的Web应用程序中,我尝试创建数据库表和休眠映射。实体之间的关系是:
Bill有买方和SaleOrder
SaleOrder有买家。
- 醇>
删除SaleOrder时,必须删除相关的帐单。
我实现了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);
答案 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的帐单。这当然是另一个问题,如何做到这一点。但你应该在上面找到好书和网络资源。