hibernate中的一对多关联映射包括单向一对多关联映射和双向一对多关联映射。下面还是通过具体的实例说一下这两种映射。
实例:
一个班级有多个学生,这样班级和学生的关系就是一对多的关系。
单向一对多关联映射
类关系图
映射文件Class.hbm.xml
<hibernate-mapping>
<class name="com.bjpowernode.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.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
映射文件student.hbm.xml
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
生成的建表语句:
createtable t_classes (id integer not null auto_increment, name varchar(255), primarykey (id))
createtable t_student (id integer not null auto_increment, name varchar(255),classesid integer, primary key (id))
altertable t_student add index FK4B9075706FDF3B8F (classesid), add constraintFK4B9075706FDF3B8F foreign key (classesid) references t_classes (id)
表结构
注意:
这样写映射文件,实体间的关系是由一的一端维护,这样多的一端student就不知道class的存在,所以在保存student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则
将无法保存数据,另外因为student不维护关系,而class维护关系,class就会发出多余的update语句。这样效率肯定大打折扣,为了解决这一问题,我们引出双向一对多映射的概念。
双向一对多关联映射
类关系图
映射文件Class.hbm.xml
<hibernate-mapping>
<class name="com.bjpowernode.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.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
注意:
使用inverse后,多的这端不在维护关系,也就是说,保存一的时候,它不再自动保存多。它将影响存储
映射文件student.hbm.xml
<hibernate-mapping>
<class name="com.bjpowernode.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>
生成的sql语句
createtable t_classes (id integer not null auto_increment, name varchar(255), primarykey (id))
createtable t_student (id integer not null auto_increment, name varchar(255),classesid integer, primary key (id))
altertable t_student add index FK4B9075706FDF3B8F (classesid), add constraintFK4B9075706FDF3B8F foreign key (classesid) references t_classes (id)
表结构
这样采用双向一对多关联映射就完美解决单向一对多关联映射所出现的问题了。