Hibernate 级联如何在双向关系中工作
我只是想知道下面的代码是如何工作的。如果父端和子端都有cascade=all 实体: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
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,它将不起作用。就好像我们在客户表中有多个客户记录一样。但对于一个客户来说,这是父母和孩子的罚款。我认为外键约束检查是存在的。