Hibernate 级联如何在双向关系中工作

Hibernate 级联如何在双向关系中工作,hibernate,hibernate-mapping,hibernate-criteria,Hibernate,Hibernate Mapping,Hibernate Criteria,我只是想知道下面的代码是如何工作的。如果父端和子端都有cascade=all 实体: public class Vendor { private int vendorId; private String vendorName; private Set children; } public class Customer { private int customerId; private String customerName; private

我只是想知道下面的代码是如何工作的。如果父端和子端都有cascade=all

实体:

public class Vendor { 
    private int vendorId;
    private String vendorName;
    private Set children;
}

public class Customer {

    private int customerId;
    private String customerName;
    private int forevenId;
    private Vendor parentObjets;
 }   
映射:

<hibernate-mapping>
    <class name="str.Customer" table="customer">     
        <id name="customerId" column="custid"  />
        <property name="customerName" column="custname" length="10"/>
        <property name="forevenId" column="forevenid"  insert="false" />     
        <many-to-one name="parentObjets" column="PrentsIds" cascade="all"/>     
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="str.Vendor" table="vendor"> 
       <id name="vendorId" column="vendid"  />
       <property name="vendorName" column="vendname" length="10"/>     
       <set name="children" cascade="all" inverse="true"> 
           <key column="forevenid" />
           <one-to-many class="str.Customer" /> 
       </set> 
   </class>
</hibernate-mapping>
第二个问题:父对象和其他子对象是如何删除的。如果我正在删除单个子对象。这也是为什么hibernate在删除子对象时考虑在父端使用cascade=all

 Object obj=session.get(Customer.class,504);
 Customer cust=(Customer)obj;
 Session.delete(cust);

对于第一个问题:您保存了集合中的所有子对象

Set s=new HashSet(); 
s.add(c1);
s.add(c2);
s.add(c3);      
v.setChildren(s);
您在关系的两侧都有级联所有,因此当您保存单个客户时,它将保存供应商和集合中的所有客户

Set s=new HashSet(); 
s.add(c1);
s.add(c2);
s.add(c3);      
v.setChildren(s);
第二节与第一节相同:您得到了cascade all,因此当您对单个子级调用delete时,它将删除供应商及其所有关联对象

尝试更改供应商的级联,看看它是否按预期工作

第一个问题-

回答-由于级联都存在于供应商端。级联将在您保存客户对象时执行,内部供应商对象也将被调用以进行持久化。您的供应商对象包含三个客户实体,它们也将被存储。阅读以获得更多许可

第二项问题-

回答-正如您在子级上编写cascade all=“true”一样,它充当父级,hibernate将删除供应商表中的相应条目

Cascade all=“true”应该在父端使用(虽然它不会在子端抛出错误)。

谢谢Zeromus,(第二个问题)如果我在供应商端更改Cascade=none,它将不起作用。就好像我们在客户表中有多个客户记录一样。但对于一个客户来说,这是父母和孩子的罚款。我认为外键约束检查是存在的。