一对多和多对一关系在实际生活中是非常常见的。在编写程序时,有两种实现的形式
分别是单向关联和双向关联。
单向关联
双向关联
本节中使用到两个类,分别是班级(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 阅读(2519)
评论(3) 编辑 收藏 所属分类:
hibernate