Hibernate实现对象与关系之间的映射,通过对对象的操作实现关系的存储,在数据库中实体之间可能会有一定的联系,例如在通用权限管理系统中会有用户和角色实体,用户和角色之间具有一定的联系,即用户拥有一定的角色,所以数据库中会出现3个表,用户表,角色表,用户角色表。其中用户角色表中存在一定的约束,主键分别是用户表和角色表的外键,用户角色表中的用户id必须来自用户表。在使用Hibernate实现时可以使用三个对象来分别对应三张表,但这样对象之间就缺乏了这种关联信息,而且不能保证这种约束关系,为了实现这种约束,Hibernate使用了对象关联关系映射。
1)首先配置hibernate配置文件,包括两个对象关系映射文件,分别对应两个类,用户和角色:
<hibernate-configuration> <session-factory > <!-- local connection properties --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/example</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">mzuser</property> <property name="hibernate.connection.password">123456</property> <!-- property name="hibernate.connection.pool_size"></property --> <!-- dialect for MySQL --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> <mapping resource="com/mz/bean/UserBean.hbm.xml"/> <mapping resource="com/mz/bean/RoleBean.hbm.xml"/> //对象关系映射配置文件 </session-factory> </hibernate-configuration>
2)数据库中有三张表,用户、角色和用户角色表:
mysql> desc CmsUser; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | userid | int(8) | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | UNI | NULL | | | password | varchar(20) | YES | | NULL | | | area | varchar(10) | YES | | NULL | | | deptrole | varchar(10) | YES | | NULL | | +----------+-------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) mysql> desc CmsRole; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | roleid | int(8) | NO | PRI | NULL | auto_increment | | rolename | varchar(20) | NO | UNI | NULL | | +----------+-------------+------+-----+---------+----------------+
mysql> desc CmsUserRole; +--------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------+------+-----+---------+-------+ | userid | int(8) | NO | PRI | 0 | | | roleid | int(8) | NO | PRI | 0 | | +--------+--------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
3)用户和角色两个类的定义,用户和角色属于多对多的关系,即一个用户可以具有多个角色,一个角色也可以被多个用户拥有,为了表示用户和角色的这种关联,在用户类中定义一个集合,表示用户拥有多个角色,对应到关系中的用户角色表:
package com.mz.bean; import java.util.HashSet; import java.util.Set; /** * Created by hadoop on 15-9-9. */ public class UserBean { private int userId; private String userName; private String password; private String area; private String deptRole; private Set<RoleBean> roles = new HashSet<RoleBean>(); public int getUserId() { return userId; } public void setUserId(int userid) { this.userId = userid; } public String getUserName() { return userName; } public void setUserName(String username) { this.userName = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getDeptRole() { return deptRole; } public void setDeptRole(String deptrole) { this.deptRole = deptrole; } public Set<RoleBean> getRoles() { return roles; } public void setRoles(Set<RoleBean> roles) { this.roles = roles; } }
package com.mz.bean; /** * Created by hadoop on 15-9-14. */ public class RoleBean { private int roleId; private String roleName; public int getRoleId() { return roleId; } public void setRoleId(int roleId) { this.roleId = roleId; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } }
4)对象关系映射配置文件
<?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.mz.bean"> <class name="com.mz.bean.UserBean" table="CmsUser"> <id name="userId" type="int"> <column name="userid"></column> <generator class="increment"/> </id> <property name="userName" type="java.lang.String"> <column name="username" length="20"></column> </property> <property name="password" type="java.lang.String"> <column name="password" length="20"></column> </property> <property name="area" type="java.lang.String"> <column name="area" length="10"></column> </property> <property name="deptRole" type="java.lang.String"> <column name="deptrole" length="10"></column> </property> <!--对象关联关系映射--> <set name="roles" table="CmsUserRole"> <key column="userid"></key> <many-to-many column="roleid" class="com.mz.bean.RoleBean" unique="true"/> </set> </class> </hibernate-mapping>
<?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.mz.bean"> <class name="com.mz.bean.RoleBean" table="CmsRole"> <id name="roleId" type="int"> <column name="roleid"></column> <generator class="increment"/> </id> <property name="roleName" type="java.lang.String"> <column name="rolename" length="20"></column> </property> </class> </hibernate-mapping>
5)测试类:创建多个用户对象和角色对象,并在用户对象中加入拥有角色的集合,最后save()用户和角色对象。
@Test public void testMMMap(){ UserBean userBean1 = new UserBean(); UserBean userBean2 = new UserBean(); RoleBean roleBean1 = new RoleBean(); RoleBean roleBean2 = new RoleBean(); RoleBean roleBean3 = new RoleBean(); userBean1.setUserName("admin1"); userBean1.setPassword("123456"); userBean2.setUserName("normal"); userBean2.setPassword("123456"); roleBean1.setRoleName("admin"); roleBean2.setRoleName("commerce"); roleBean3.setRoleName("finance"); userBean1.getRoles().add(roleBean1); userBean1.getRoles().add(roleBean2); userBean2.getRoles().add(roleBean1); userBean2.getRoles().add(roleBean3); Session session = SessionUtil.getSession(); org.hibernate.Transaction ta = session.beginTransaction(); session.save(userBean1); session.save(userBean2); session.save(roleBean1); session.save(roleBean2); session.save(roleBean3); ta.commit(); SessionUtil.closeSession(); }
6) 结果查询:查询数据库发现三张表中都插入了新的数据,其中用户角色表中有用户关系与角色关系的联系。
mysql> select * from CmsUser; +--------+----------+----------+------+----------+ | userid | username | password | area | deptrole | +--------+----------+----------+------+----------+ | 1 | admin1 | 123456 | NULL | NULL | | 2 | normal | 123456 | NULL | NULL | +--------+----------+----------+------+----------+ 2 rows in set (0.00 sec) mysql> select * from CmsRole; +--------+----------+ | roleid | rolename | +--------+----------+ | 1 | admin | | 2 | commerce | | 3 | finance | +--------+----------+ 3 rows in set (0.00 sec) mysql> select * from CmsUserRole; +--------+--------+ | userid | roleid | +--------+--------+ | 1 | 1 | | 2 | 1 | | 1 | 2 | | 2 | 3 | +--------+--------+ 4 rows in set (0.00 sec)
相关推荐
此外,本书还会深入到Hibernate的高级特性,如级联操作、延迟加载、集合映射、多态映射、关联映射(一对一、一对多、多对多)等。这些特性让开发者能够处理复杂的数据结构和业务逻辑。例如,级联操作允许一次操作就...
【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...
Hibernate是目前广泛使用的持久层框架,它采用对象关系映射(ORM)技术,将Java对象映射到关系型数据库中。在使用Hibernate进行数据持久化操作时,如何处理实体之间的关联关系是一个非常重要的方面。实体关联关系映射...
Hibernate是一种持久层框架,主要用于Java应用程序中的对象关系映射(ORM),它能够将面向对象的数据模型转换为数据库中的关系型数据模型,从而简化了数据访问和操作的复杂性。 ### 一对一关联 一对一关联是数据库...
实体关联关系映射是指在Hibernate框架下如何将Java对象之间的关联关系映射到数据库表中的过程。根据实体之间关联关系的不同,Hibernate提供了多种映射方式: 1. **一对一关联**(One-to-One) - 外键单向关联 - ...
在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将详细讲解Hibernate中的关联关系映射配置,帮助你理解和掌握如何...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、双向关联、自关联等。 8. **继承映射**:允许开发者使用Java的继承结构来设计数据库表,如单表继承和联合继承。 9. **延迟...
2. **Chapter 3**: 深入讨论了实体类和数据表的映射,包括实体类的定义,属性与数据库字段的对应,以及一对一、一对多、多对多等关联关系的映射。这部分还可能涉及到了`@Entity`, `@Table`, `@Id`, `@GeneratedValue...
"hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...
【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...
### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...