一对多关系可以分为单向和双向。
一对多关系单向
单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表)。比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键。母亲与孩子的关系就是一对多的关系。如果想对母亲信息的操作同时也反应在其孩子信息上那么可以在母亲类配置文件的集合属性上配置cascade="all",表示对关联实体进行级联更新配置。
“主”端: 多的一端
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.java1234.model"> <class name="Student" table="t_student"> <id name="id" column="stuId"> <generator class="native"></generator> </id> <!-- 多的一端// column 数据中的别名 cascade 表示级联关系 通常用在多对一 ,和多对多的映射中 --> <property name="name"></property> <many-to-one name="c" class="com.java1234.model.Clazz" column="ClazzId"></many-to-one> </class> </hibernate-mapping>
一的一端:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.java1234.model"> <class name="Clazz" table="t_clazz"> <id name="id" > <generator class="native"></generator> </id> <property name="name" column="clazzName"></property> </class> </hibernate-mapping>
一对多单向映射:多对一的映射关系是在多的一端进行维护的,一对多关系映射则由一端来维护这种关系。
“主”端:一的一端来维护这种关系 ,用set标签 在t_student的表中添加字段ClazzId来进行关联。
一对多关联映射利用了多对一关联映射原理:
多对一关联映射:在多的一端加入外键指向一的一端,他维护的关系是多指向一
一对多关联映射: 在多的一端加入外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。
在一的一端维护的关系的缺点: 如果经t_student 表里面的clazzId 字段设为非空,则无法保存。
一对多双向
一对多双向。在双向关联时每个Student都有一个clazz的引用,所以在配置clazz.hbm.xml文件时有些不同
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.java1234.model"> <class name="Clazz" table="t_clazz"> <id name="id" column="clazzId"> <generator class="native"></generator> </id> <property name="name" column="className"></property> <set name="students" cascade="all" inverse="true"> <!-- cascade 有五个选项 分别是:all ,delete ,none,save-update,delete-orphan ; all : 所有情况下均进行关联操作。 none:所有情况下均不进行关联操作。这是默认值。 save-update:在执行save/update/saveOrUpdate时进行关联操作。 delete:在执行delete时进行关联操作。 delete-orphan: 当save/update/saveOrUpdate时,相当于save-update ;当删除操作时,相当于delete ; --> <key column="clazzId"></key> <one-to-many class="com.java1234.model.Student" /> </set> </class> </hibernate-mapping>
在一一端的集合上使用<set>,在对方表中加入一个外键指向一一端。
在多的一端要采用<many-to-one>标签
时间: 2024-10-27 19:42:11