原作者:http://www.verydemo.com/demo_c146_i2174.html
用户和角色属于多对对关系,一个用户可以拥有多个角色,一个角色也可以属于多个用户。
public class User { private int userid; private String username; private Set roles; getter and setter.. }
public class Role { private int roleid; private String rolename; getter & setter }
User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wyx.hibernate"> <class name="User" table="t_User"> <id name="userid"> <generator class="native"/> </id> <property name="username"/> <set name="roles" table="t_User_Role" cascade="all"> <key column="userid" /> <many-to-many class="Role" column="roleid"/> </set> </class> </hibernate-mapping>
set标签中的name指的是user的关联关系字段,set代表了中间表,用table指定中间表的名字,用key 的column属性作为外键指向user表的userid,many-to-mang的column作为外键指向role表的roid,构成了复合主键(由userid和roleid构成的)。
Role.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wyx.hibernate"> <class name="Role" table="t_Role"> <id name="roleid"> <generator class="native"/> </id> <property name="rolename"/> </class> </hibernate-mapping>
测试一对多save,从user方存储:
public void testSave(){ Session session = HibernateUtils.getSession(); try { session.beginTransaction(); Role role1 = new Role(); role1.setRolename("程序员"); //session.save(role1); Role role2 = new Role(); role2.setRolename("架构师"); //session.save(role2); Set roles = new HashSet<Role>(); roles.add(role1); roles.add(role2); User user =new User(); user.setUsername("冰吼"); user.setRoles(roles); session.save(user); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }
打印输出:
Hibernate: insert into t_User (username) values (?)
Hibernate: insert into t_Role (rolename) values (?)
Hibernate: insert into t_Role (rolename) values (?)
Hibernate: insert into t_User_Role (userid, roleid) values (?, ?)
Hibernate: insert into t_User_Role (userid, roleid) values (?, ?)
测试一对多load,从user一方存储:
public void testLoad(){ Session session = HibernateUtils.getSession(); try { session.beginTransaction(); User user = (User)session.load(User.class, 1); Set<Role> roles = user.getRoles(); System.out.println("user.username = " + user.getUsername()); for(Iterator<Role> iter = roles.iterator(); iter.hasNext();){ Role role = iter.next(); System.out.println("user.role.rolename = " + role.getRolename()); } session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }
打印输出:
....................................................................
双向多对多关联映射与单向的基本一致,不同之处就是在双发都加入了set集合来保存关联关系,但是在存储字段的时候,最好指定根据一方来添加,两边都存储容易造成混乱,在其中的一方映射文件的set标签中加入inverse = "true",将控制权交给另一方处理。【inverse属性只能应用于一对多双向关联、多对多双向关联】
修改Role.java:
package com.wyx.hibernate; import java.util.Set; public class Role { private int roleid; private String rolename; private Set users; getter & setter... }
修改Role.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wyx.hibernate"> <class name="Role" table="t_Role"> <id name="roleid"> <generator class="native"/> </id> <property name="rolename"/> <set name="users" table="t_User_Role" inverse="true" cascade="all" order-by="userid"> <key column="roleid"/> <many-to-many class="User" column="userid"/> </set> </class> </hibernate-mapping>
/** * save role casecad user */ public void testSave(){ Session session = HibernateUtils.getSession(); try { session.beginTransaction(); User user1 =new User(); user1.setUsername("冰吼"); User user2 =new User(); user2.setUsername("蓝胖"); Set users = new HashSet<User>(); users.add(user1); users.add(user2); Role role = new Role(); role.setRolename("架构师"); role.setUsers(users); session.save(role); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }
加入了inserse = "true",就不能从Role端存入数据,用以上测试方法存数据,中间表是不能存入数据的,但是去掉inserse就可以,但为了防止出错,还是加inverse由指定固定一方控制添加比较好。
相关推荐
NULL 博文链接:https://yxwang0615.iteye.com/blog/970729
资源名称:Hibernate3.2官方中文参考手册内容简介: Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。资源截图: 资源太大...
这个是针对初学Hibernate一对多主键关联映射的源代码 ,希望对初学者有所帮助,开发环境是MyEclipse7.5和HIbernate3.2
Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 ...1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 · · ·
本书内容主要包括三部分,第一部分介绍Java EE...第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,让读者理论联系实际,将三个框架真正运用到实际开发中去
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...
15.3 映射双向多对多关联关系 15.3.1 关联两端使用元素 15.3.2 在inverse端使用元素 15.3.3 使用组件类集合 15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索...
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...
3.2 Hibernate配置 3.3 日志配置 3.4 第一段代码 3.5 代码初解 第4章 Hibernate基础 4.1 Hibernate基础语义 4.2 基础配置 4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 ...
Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。
多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射...
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...