Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate中的级联删除和一对一映射_Java_Hibernate_Cascade - Fatal编程技术网

Java 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=

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

  • 汇票有买方和卖方

  • 销售订单有买家

  • 删除销售订单时,必须删除关联的票据

    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; 
        ... 
    }   
    
  • 我实现了java类,创建了表

    在模式中,表SALEORDER有一个FK列“买方ID”。 此表没有其他外键列。 table 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>
    
    模式是:

    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();