您的位置:首页 > 其它

Hibernate几种关系映射总结(单向关联)

2010-07-06 15:35 549 查看
使用Hibernate的关联映射可以大大简化持久层数据的访问。关联关系大体上可以分为两类:单向关联和双向关联。所谓单向关联是指:只需要单向访问关联端;双向关联是指关联的两端可以相互访问。下面,我们首先来谈谈单向关联:

1、单向多对一(N-1)

举一个生活中的一个简单例子:用户和组的关系就是明显的多对一关系,一个组里面有多个用户.我们使用单向的n-1来映射这种关系.

=============================================================================

public class User {

private int id;

private String name;

private Group group;

//...setter、getter方法

}

-----------------------------------------------------------------------------------------------------------------------------------------------

public class Group {

private int id;

private String name;

//...setter、getter方法

}

-----------------------------------------------------------------------------------------------------------------------------------------------

配置相应的映射文件 User.hbm.xml

<hibernate-mapping>
<class name="com.hcit.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>

配置 Group.hbm.xml

<hibernate-mapping>
<class name="com.hcit.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>

单向n-1关联关系映射小结:这里我们需要维护的关系是多个User可以对应同一个Group,我们只要在多的一端加上一个外键指向一的一端即可.本例中我们在User一端添加了一个groupid作为外键指向Group端。通过多的一端维护这种关联关系.

2、单向1-1关联映射

2.1 基于外键的单向1-1

这种方式比较简单,我们可以采用<many-to-one>标签,指定多的一端的unique="true",这样就限制了多的一端的多重性唯一

通过这种手段映射一对一唯一外键关联 修改配置文件:

<many-to-one name="group" column="groupid" unique="true"/>

2.2基于主键的单向1-1

这里我们也举一个简单的例子。每个人(Person)都有一张身份证(IdCard)

-----------------------------------------------------------------------------------------------------------------------------------------------

public class IdCard {

private int id;

private String cardNo;

//...setter、getter方法

}

-----------------------------------------------------------------------------------------------------------------------------------------------

public class Person {

private int id;

private String name;

private IdCard idCard;

//...setter、getter方法

}

配置相应的映射文件IdCard.hbm.xml

<hibernate-mapping>
<class name="com.hcit.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>

配置Person.hbm.xml

<hibernate-mapping>
<class name="com.hcit.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>

这里需要解释一下的是Person的主键来源idCard,one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载

constrained="true" 表明当前主键上存在一个约束,person的主键作为外键参照了idCard

3、单向1-n关联映射

实例:我们知道一个班级有多名学生,这就是一个典型的1-N关系

public class Classes {

private int id;

private String name;

private Set students; //集合

...//生成相应的getter、setter方法

}

-----------------------------------------------------------------------------------------------------------------------------------------------

public class Student {

private int id;

private String name;

..//生成相应是getter、setter方法

}

配置文件

<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>

映射原理:一对多关联映射,在多的一端添加一个外键classesid指向一的一端,它维护的关系是一指向多

4、单向n-n关联映射

public class User {

private int id;

private String name;

private Set roles; //集合

..//生成相应的getter、setter方法

}

public class Role {

private int id;

private String name;

..//生成相应的getter、setter方法

}

现在需要映射这样的N-N关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有,

这样我们就可以将一个N-N关系拆分为两个N-1的关系 User.hbm.xml配置文件

<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>

<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="Role" column="roleid"/>
</set>
</class>

//现在我们的关系明确了

t_user t_user_role t_role

id name < -------userid roleid ----- > id name

下面要谈谈双向关联关系了,双向关联主要有:双向1-1、双向1-N、双向N-N

未完待续....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: