级联如何在双向关系中发挥作用

时间:2016-07-21 09:42:55

标签: 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 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>

测试类:

第一个问题:其他子对象是如何插入的。即使我保存了单个子对象。

class vendor{
    //vendor
    Vendor v =new Vendor(); 
    v.setVendorId(101);
    v.setVendorName("java4s");  
    //customer   
    Customer c1=new Customer(); 
    c1.setCustomerId(504);
    c1.setCustomerName("customer4");     
    Customer c2=new Customer(); 
    c2.setCustomerId(505);     
    c2.setCustomerName("customer5");   
    Customer c3=new Customer(); 
    c3.setCustomerId(506);
    c3.setCustomerName("customer6");     
    // one-to-many
    Set s=new HashSet(); 
    s.add(c1);
    s.add(c2);
    s.add(c3);      
    v.setChildren(s);
    // many-to-one  

   c1.setParentObjets(v);
   c2.setParentObjets(v);
   c3.setParentObjets(v)
    session.save(c1);
}

第二个问题:父对象和其他子对象如何删除。如果我要删除单个子对象。还有为什么hibernate在删除子项时考虑cascade = all在父端。

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

2 个答案:

答案 0 :(得分:1)

第一个问题:你在集合中保存了所有子对象

Set s=new HashSet(); 
s.add(c1);
s.add(c2);
s.add(c3);      
v.setChildren(s);

您在关系的两侧都有级联所有,因此当您保存单个客户时,它将保存供应商和集合中的所有客户

第二节与第一节相同:你有级联全部所以当你甚至在一个孩子上调用删除时,它会删除供应商及其所有相关对象。

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

答案 1 :(得分:0)

第一个问题 -

答案 - 由于级联都出现在供应商方面。在保存客户对象时将执行过程,内部供应商对象也将被调用持久性。您的供应商对象包含三个客户实体,也将存储。请阅读this以获得更多许可。

第二个问题 -

答案 - 正如您在孩子身上写了cascade all =“true”,它充当父级,而hibernate删除了Vendor表中的相应条目。

Cascade all =“true”应该在父方使用(虽然不会在子方面引发错误)。