<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.zjlolife.netstore.domain.Order" table="t_order">
<id name="id" column="order_id">
<generator class="increment" />
</id>
<property name="orderNum" column="order_num" />
<many-to-one name="customer" column="customer_id" class="com.zjlolife.netstore.domain.Customer" cascade="save-update"/>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.zjlolife.netstore.domain.Customer" table="t_customer">
<id name="id" column="customer_id">
<generator class="increment"/>
</id>
<property name="name" column="name"/>
<set name="orders">
<key column="customer_id"/>
<one-to-many class="com.zjlolife.netstore.domain.Order"/>
</set>
</class>
</hibernate-mapping>
测试Test.java
public void test3() {
Session session = HibernateUtil.getInstance().getSession();
Transaction tx = null;
tx = session.beginTransaction();
try {
Customer customer = (Customer)session.get(Customer.class, 1);
session.delete(customer);
tx.commit();
}catch(Exception e) {
tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
customer与order是一对多的双向关系,下面删除的问题就来了
只在customer中的set配置(修改xml):
①什么也不修改,结果为,Update order null 和 delete customer
②lazy="false 结果为报错:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.zjlolife.netstore.domain.Customer#1]
因为lazy="false"的时候,get上来的customer,中的set<Order> orders不为空,而删除customer的时候,必须先清楚customer,和oder之间的关系。所以会报错。
当lazy="true" 的时候,get上来的customer中的orders为空,相当于清楚了关系,因此可以删除customer
③lazy="true",inverse="true",此时会报错,外键约束错误
④lazy="false",inverse="true",必然报错,不用想了
⑤cascade="all",不会报错,但会先发出update外键为Null,再发出2条delete语句删除order与customer
在这种情况,我发现了很特别的情况,当delete(customer)的时候会发出select order语句,我觉得是因为在级联的情况下,会在delete()的时候加载order。
因为customer控制了关系,所以删除之前会先update order null
⑥cacade="all",inverse="true" ,在这种情况下:
Hibernate: delete from t_order where order_id=?
Hibernate: delete from t_customer where customer_id=?只发出两条delete