一对多关联(学生与所修课程的关系)
多对一关联映射:是在多的一端添加一个外键维护多指向一的关联引用
一对多关联映射:是在多的一端添加一个外键维护一指向多的关联引用
也就是说,一对多和多对一的映射策略是一致的,只是站的角度不同
单向关联
缺点:
更新student表中的classid字段时,需要对每一个student发出一个update的sql来更新classid字段
如果将t_student表中的classid设置为非空,则不能保存student数据,因为关系是由classes维护的,在保存student时,还没有对应的classid被生成。
Hibernate: insert into t_student (name) values (?)
Hibernate: update t_student set classid=? where id=?
Classes.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetomany1.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classid"/>
<one-to-many class="com.hibernate.onetomany1.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetomany1.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
双向关联
一对多双向关联映射的方法:
在一的一端:在集合标签里面使用<key>标签来表明需要在对方的表中添加一个外键指向一的一端。
在多的一端:使用<many-to-one>标签来映射。
需要注意:<key>标签所指定的外键字段名需要与<many-to-one>标签定义的外键字段名一致,否则便会造成引用数据的
丢失!
注意:
如果从一端来维护一对多双向关联的关系,hibernate会发出多余的update语句,所以
一般地情况下,我们便会从多一端来维护其关联关系!
Classes.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetomany2.Classes" table="t_classes2">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" >
<key column="classid"/>
<one-to-many class="com.hibernate.onetomany2.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetomany2.Student" table="t_student2">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classid"/>
</class>
</hibernate-mapping>