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)
相关推荐
NULL 博文链接:https://dreamzhong.iteye.com/blog/1205496
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...
本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...
NULL 博文链接:https://linfeng5211.iteye.com/blog/265731
hibernate关联映射详解SSH 多对多,一对多关系对象映射
hibernate 的基础 常用的主键生成策略 持久化对象的三种状态 一级缓存的常用操作(save/update/saveOrUpdate/delete)一对多关联映射 级联操作
第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的方式) 第五课:spring对AOP...
2).在第6章简答题2员工奖项的基础上 使用连接查询完成以下功能 1> 查询所有员工获得的所有奖项 并打印输出员工姓名和奖项名称 ... 2> 查询所有奖项的获奖人数 并打印输出奖项名称和获奖次数 ...
映射一对多关联关系 以Customer和Order为例: 一对多: 每个Customer可以有一个或者多个Order,因此Customer中应该有一个集合类型的属性,来引用所有关联的Order对象。 多对一。全实例讲解
hibernate双向一对多关联映射(XML)
本文分析了基于Hibernate框架的两种对象关系映射策略,并比较了三种继承映射策略的优缺点,设计了一种基于Hibernate的ORM持久化层的系统架构,该架构结构清晰、开发效率高,具有较高的应用价值。
所谓关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用。下面这篇文章详细的给大家介绍了Hibernate映射解析之关联映射的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
二.ORM:ORM是对象到关系的映射(Object Relational Mapping),是将数据持久化的过程 1.Hibernate持久化类:Hibernate的持久化类是一个JavaBean(pojo+相应属性的getter和setter方法),该JavaBean最好实现java.io....
映射一对多双向关联关系 1 Customers 类中加如set类型的 Orders属性,Orders类中加入Customer类型的customer属性。 2 测试时,建立两者一对多的双向关联关系。 Customers customer=new Customer(“Tom”,new ...