一对多关联映射利用了多对一关联映射原理
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同
在一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,所以需要发出多余的update语句来更新关系
一、hihernate一对多关联映射(单向Classes----->Student)
Classes.hbm.xml
<hibernate-mapping package="com.bjsxt.hibernate"> <class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>
Student.hbm.xml
<hibernate-mapping> <class name="com.bjsxt.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
二、hihernate一对多关联映射(单向Classes----->Student)
Classes.hbm.xml
<hibernate-mapping package="com.bjsxt.hibernate"> <class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students" inverse="true" cascade="all"> <key column="classesid"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>
Student.hbm.xml
<hibernate-mapping> <class name="com.bjsxt.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="classes" column="classesid"/> </class> </hibernate-mapping>
三、lazy – 延迟加载(懒加载)
lazy – 延迟加载(懒加载),一般用于集合的抓取策略,也就是说只在需要用到的情况下,再发出select语句,将其相关的对象查询出来 ,set默认lazy属性的值是true,即hibernate会自动使用懒加载策略,以提高性能
<set name="students“ lazy=“false”> <key column="classesid" ></key> <one-to-many class="com.bjsxt.hibernate.Student" /> </set>
四、inverse – 标记由哪一方来维护关联关系(双向关联中会用到)
inverse默认值为false
如果inverse设置为true,表示将由对方维护两者之间的关联关系。
inverse="true" 反转,cascade="all"级联,共同结果由对方维护两者之间的关联关系.
<set name="students“ lazy=“false” inverse=“true”> <key column="classesid" ></key> <one-to-many class="com.bjsxt.hibernate.Student" /> </set>