一對多和多對一關系在實際生活中是非常常見的。在編寫程序時,有兩種實現的形式
分別是單向關聯和雙向關聯。
單向關聯
雙向關聯
本節中使用到兩個類,分別是班級(Team)和學生(Student),學生和班級之間是多對一
關系。
具體的關聯實現源代碼如下:
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string'/>
<many-to-one name="team"
class="model.Team"
column="team_id" <!--和team發生關聯的列名-->
cascade="none"
fetch="join"
/>
</class>
</hibernate-mapping>
<many-to-one>標簽具有column屬性,column屬性總是和關聯類(對于Student來說,關聯類
是Team)的主鍵id 相對應,因此Hibernate會根據student表中的team_id,根據Team表中設置
的id列(一般情況列名也叫id),取出team.id=student.team_id的記錄,構造成Team對象返
回給Student類。
Team.hbm.xml
...
<hibernate-mapping>
<class name="model.Team" table="team" lazy="true">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="teamName" type="string"/>
<set name="students" cascade="save-update" lazy="true" inverse="true">
<key column="team_id"/>
<one-to-many class="model.Student"/>
</set>
</class>
</hibernate-mapping>
Team對Student是一對多關系,一對多具有<key column=""/>屬性,key標簽總是和本身類的主鍵
相對應。在取得Team對象時,通過Team的主鍵id與Student表中的team_id進行匹配,如果
team.id=student.team_id,則認為此學生是本班級的,于是加載學生,把學生對象加入Team
對象的學生集合。
設置inverse標簽
由于在Team.hbm.xml中設置了inverse="true",Team和Student之間的關系轉由Student來維護
因此,當Team掌握維護權時(inverse="false"或者默認狀態),它負責將自己的id告訴Student
,然后Hibernate發送update語句去更新記錄。但現在設置了inverse="true"之后,維護權在
Student手中,于是Hibernate不再發送update語句,而由Student自動去取得team_id,而這個
動作其實就是完成一個“學生添加班級”動作,也就是語句newStu.setTeam(team)。
posted on 2007-12-29 14:32
Ke 閱讀(2528)
評論(3) 編輯 收藏 所屬分類:
hibernate