级联如何在双向关系中工作
How cascade works in bidirectional relaltionalship
我只是想知道下面的代码是怎样的working.If 我们在父子端都有 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:
第一个问题:其他子对象是如何插入的。即使我正在保存单个子对象。
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);
第一个问题:你把childobject全部保存在集合
中
Set s=new HashSet();
s.add(c1);
s.add(c2);
s.add(c3);
v.setChildren(s);
你在关系的两边都级联所有,所以当你保存单个客户时,它将保存供应商和集合中的所有客户
第二节与第一节相同:你得到了级联所有所以当你调用删除时它会删除供应商和他所有关联的objects,即使是一个child.
尝试更改供应商上的级联,看看它是否按预期工作
第一个问题-
回答 - 由于级联所有存在于供应商 side.Cascade 将在您保存客户 object 时执行,内部供应商 object 也将被调用用于 persistence.Your 供应商object 包含三个客户实体,它们也将被存储。阅读 this 以获得更多许可。
第二个问题 -
回答- 因为你已经在你的 child 上编写了 cascade all ="true",它作为一个 parent 并且休眠删除了 Vendor table 中的相应条目。
Cascade all = "true" 应该用在 parent 端(虽然它不会在 child 端抛出错误)。
我只是想知道下面的代码是怎样的working.If 我们在父子端都有 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:
第一个问题:其他子对象是如何插入的。即使我正在保存单个子对象。
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);
第一个问题:你把childobject全部保存在集合
中Set s=new HashSet();
s.add(c1);
s.add(c2);
s.add(c3);
v.setChildren(s);
你在关系的两边都级联所有,所以当你保存单个客户时,它将保存供应商和集合中的所有客户
第二节与第一节相同:你得到了级联所有所以当你调用删除时它会删除供应商和他所有关联的objects,即使是一个child.
尝试更改供应商上的级联,看看它是否按预期工作
第一个问题-
回答 - 由于级联所有存在于供应商 side.Cascade 将在您保存客户 object 时执行,内部供应商 object 也将被调用用于 persistence.Your 供应商object 包含三个客户实体,它们也将被存储。阅读 this 以获得更多许可。
第二个问题 -
回答- 因为你已经在你的 child 上编写了 cascade all ="true",它作为一个 parent 并且休眠删除了 Vendor table 中的相应条目。
Cascade all = "true" 应该用在 parent 端(虽然它不会在 child 端抛出错误)。