我只是想知道下面的代码是如何工作的。如果我们在父级和子级都有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);
答案 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”应该在父方使用(虽然不会在子方面引发错误)。