数据库的关联关系既可以在数据库中以外键的方式维护,也可以交给hibernate来维护。
一、数据库中维护的方式:如下图,在”删除时“和”更新时“选择对应的策略:
* RESTRICT
* NO ACTION
* CASCADE
* SET NULL
各策略的含义参考本博客的上一篇文章:
MySQL外键约束:http://blog.csdn.net/wzygis/article/details/21515127
二、让框架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“