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)
表結構
這樣採用雙向一對多關聯映射就完美解決單向一對多關聯映射所出現的問題了。