在前一篇文章,我们说了多对一和一对多映射原理是一样的,都是在多的一端加入一个外键指向一的一端。
区别在于维护的关系不同。
区别在于维护的关系不同。
- 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的时候会把一加载上来
- 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的时候会把多加载上来
一对多映射包含两种映射方式:
1.单向一对多
对象模型图:
关系模型图:
Classes.hbm.xml配置文件
<?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.blackfox.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 设置在多的一端加入一个外键 -->
<set name="students">
<key column="classesid"/>
<one-to-many class="com.blackfox.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml配置文件
<?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.bjpowernode.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
为什么不让一的一端来维护关系呢?
- 多的一端Student不知道Classes的存在,(也就是Student没有维护与Classes的关系) 所以在保存Student的时候关系字段classesid是为null,如果将该字段设置为非空,则将无法保存数据。
- Student不维护关系,而Classes维护关系,Classes就会发出多余的update语句,保证class 和 Student有关系,这样加载classes的时候才可以把该Classes对应的学生加载上来。
为了解决这种弊端,Hibernate提供了第二种映射方式,即双向一对多映射。
2.双向一对多
对象模型图
关系模型图
一对多双向关联的映射方式:
- 在一的一端的集合上采用<key>标签,在多的一端加入一个外键
- 在多的一端采用<many-to-one>标签
!!!注意:<key>标签和<many-to-one>标签加入的字段保持一致,否则会产生数据混乱
Classes.hbm.xml配置文件
<?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.blackfox.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" inverse="true">
<key column="classesid"/>
<one-to-many class="com.blackfox.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml配置文件
<?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.blackfox.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--Student也维护了关系 -->
<many-to-one name="classes" column="classesid"/>
</class>
</hibernate-mapping>
!!!注意:采用一对多双向关联的目的主要是解决一对多单向关联的缺陷而不是需求驱动的。