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
未完待续....
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
未完待续....
相关文章推荐
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式
- Hibernate实体关系映射:单向主键一对一关联
- hibernate 关系映射之 单向外键关联一对一
- Hibernate关系映射1:单向N-1关联
- Hibernate关系映射(六)多对多单向关联@ManyToMany Annotation方式
- hibernate-关系映射(多对一单向关联)-8
- Hibernate教程04_关系映射之一对一单向外键关联
- 【hibernate框架】关系映射之一对一单向外键关联(XML实现)
- Hibernate学习随笔-----关系映射(3)单向1-N关联
- Hibernate 映射关系 ---One2Many单向关联
- 【HIbernate框架学习】:Hibernate对象关系映射之单向多对多关联映射
- Hibernate关系映射(3)_一对一单向主键关联
- Hibernate关系映射(7)_多对一单向关联
- hibernate-关系映射(一对多单向关联)-9
- Hibernate 关系映射(7) 基于外键关联的单向1:N
- Hibernate学习随笔-----关系映射(1)单向N-1关联
- Hibernate关系映射(单向关联)
- Hibernate中的几种映射关系----------一对多关联映射
- Hibernate关系映射(8)_一对多单向关联
- Hibernate学习随笔-----关系映射(4)单向N-N关联