Hibernate级联删除

数据库的关联关系既可以在数据库中以外键的方式维护,也可以交给hibernate来维护。

一、数据库中维护的方式:如下图,在”删除时“和”更新时“选择对应的策略:

* RESTRICT

* NO ACTION

* CASCADE

* SET NULL

各策略的含义参考本博客的上一篇文章:

MySQL外键约束:http://blog.csdn.net/wzygis/article/details/21515127

 

Hibernate级联删除_第1张图片

二、让框架hibernate来维护,在配置文件中指定关联关系,以Person类和Address类的关系为例:

Person.hbm.xml

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.crazyit.app.domain">
	<!-- 映射Person持久化类-->
	<class name="Person" table="person_inf">
		<!-- 映射标识属性 -->
		<id name="id" column="person_id">
			<!-- 定义主键生成器策略 -->
			<generator class="identity">
			</generator>
		</id>
		<!-- 用于映射普通属性 -->
		<property name="name" type="string"/>
		<property name="age" type="int"/>
		
		<set name="address" lazy="true" cascade="all">
			<key column="person_id"/>
			<one-to-many class="Address"/>
		</set>
		
	</class>
</hibernate-mapping>


 

Address.hbm.xml

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.crazyit.app.domain">
	<!-- Address持久化类-->
	<class name="Address" table="address_inf">
		<!-- 映射标识属性addressid -->
		<id name="addressId" column="address_id">
			<!-- 指定主键生成器策略 -->
			<generator class="identity"/>
		</id>
		<!-- 映射普通属性addressDetail -->
		<property name="addressDetail"/>
		<many-to-one name="person" class="Person" cascade="all"></many-to-one>
	</class>
</hibernate-mapping>


测试的主函数

package lee;

import org.crazyit.app.domain.Address;
import org.crazyit.app.domain.Person;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class PersonManager
{
	public static void main(String[] args)
	{
		PersonManager mgr = new PersonManager();
		mgr.CreatPerson();
		mgr.delete();
		HibernateUtil.sessionFactory.close();
	}
	
	public void CreatPerson()
	{
	Session session = HibernateUtil.currentSession();
	Transaction tx = session.beginTransaction();
	Person p = new Person();
	Address a = new Address("address1");			//①
	//session.persist(a);
	p.setName("Yeeku");
	p.setAge(29);
	p.getAddress().add(a);
	a.setPerson(p);
	Address a2 = new Address("address2");
	//session.persist(a2);
	p.getAddress().add(a2);		
	a2.setPerson(p);
	session.save(p);
	tx.commit();
	HibernateUtil.closeSession();
	}
	public void delete(){
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		session.delete(session.get(Person.class, 2));
		tx.commit();
		HibernateUtil.closeSession();
	}
}


注意:

1、在级联删除时,持久化对象应以session.get(class,pk);或session.load(class,pk);的方式。

2、在N端中设置级联方式为:cascade=”all“

你可能感兴趣的:(Hibernate级联删除)