Java hibernate中的级联删除和一对一映射
在为买家创建Bill for SaleOrder的web应用程序中,我尝试创建数据库表和hibernate映射。实体之间的关系是:Java hibernate中的级联删除和一对一映射,java,hibernate,cascade,Java,Hibernate,Cascade,在为买家创建Bill for SaleOrder的web应用程序中,我尝试创建数据库表和hibernate映射。实体之间的关系是: 汇票有买方和卖方 销售订单有买家 删除销售订单时,必须删除关联的票据 class Bill{ private Long billId; ... } class SaleOrder{ private Long saleOrderId; ... @OneToOne(cascade=
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;
...
}
<!-- 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>
模式是:
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配置对我来说似乎有点过时。解决办法是在法案中不保留任何参考资料。但SaleOrder将使用关系定义上方的CascadeType.DELETE_ORPHAN,1-1引用Bill,1-n引用SaleOrder。因此,当删除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;
...
}
类账单{
私人长billId;
...
}
类顺序{
私有长序列号;
...
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@级联({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
私人法案;
...
}
类买家{
私人长型buyerId;
私有字符串名称;
...
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@级联({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
私人买卖订单;
...
}
您必须对DAO进行编码,以获取买家的SaleOrder和账单的SaleOrder。当然,这是另一个问题,如何做到这一点。但是你应该在上面找到好书和网络资源。谢谢你的详细回答。但是我们被要求不要将Bill_ID放入SaleOrder表或类中。这就是所有这些麻烦的原因。现在,我明白了。然后你必须“编码”,我认为你不能用XML“配置”。级联删除的工作原理如上图所示。您所要求的可以称为“对等删除”或“参考删除”,这不是JPA或Hibernate的一部分。下面是使用HQL:Session Session=(Session)entityManager.getDelegate()的代码片段;//删除引用SaleOrder Query=session.createQuery的票据条目(“删除SaleOrder_id=:SaleOrder_id的票据”);setParameter(“saleOrder_id”,saleOrder_id).executeUpdate();