hibernate基于主键的双向多对多的关联映射


1、类Role 和Function类
Fole:
public class Role {
	private int id;
	private String name;
	private Set<Function> functions = new HashSet<Function>(0);
	//get…set

}

  Function:

public class Function {
	private int id;
	private String name;
	private String code;
	private String url;
	private Set<Role> roles = new HashSet<Role>(0);

	public Function() {
		// TODO Auto-generated constructor stub
	}
	public Function(String name, String code, String url) {
		super();
		this.name = name;
		this.code = code;
		this.url = url;
	}

	//get…set }

2、	映射文件
Role.hbm.xml
<hibernate-mapping package="cn.siggy.pojo">
	<class name="Role">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
		<!-- 多对多 -->
		<set name="functions" table="role_func" cascade="save-update">
			<!-- 表示当前类 映射到关系表中的列-->
			<key column="rid"/>
			<!-- 所对应的另一方在关系表中的列 -->
			<many-to-many column="fid" class="Function"/>
		</set>
	</class>
</hibernate-mapping>
function.hbm.xml

<hibernate-mapping package="cn.siggy.pojo">
	<class name="Function">
		<id name="id">
			<!-- foreign表示引用外键 -->
			<generator class="native"/>
		</id>
		<property name="name"/>
		<property name="code"/>
		<property name="url"/>
<set name="roles" table="role_func" inverse="true">
			<key column="fid"/>
			<many-to-many column="rid" class="Role"/>
		</set>
	</class>
</hibernate-mapping>
3、	测试代码
@Test
	public void testSave() throws HibernateException, SerialException, SQLException{
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			Function f1 = new Function("用户管理","user_mag","userAction");
			Function f2 = new Function("角色管理","role_mag","roleAction");
			Function f3 = new Function("系统管理","sys_mag","sysAction");
			Function f4 = new Function("权限管理","prev_mag","prevAction");
			Role r1 = new Role();
			r1.setName("admin");
			r1.getFunctions().add(f1);
			r1.getFunctions().add(f2);
			r1.getFunctions().add(f3);
			r1.getFunctions().add(f4);
			Role r2 = new Role();
			r2.setName("vip");
			r2.getFunctions().add(f1);
			r2.getFunctions().add(f2);
			session.save(r1);
			session.save(r2);

			tx.commit();

		}catch (HibernateException e) {
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
			throw e;
		}finally{
			HibernateUtil.closeSession();
		}
	}
	@Test
	public void testGet(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			Role role = (Role)session.get(Role.class, 1);
			System.out.println("角色名:"+role.getName());
			System.out.println("该角色所对应的权限:");
			for(Iterator<Function> iter = role.getFunctions().iterator();
					iter.hasNext();){
				Function func = iter.next();
				System.out.println(func.getName()+"---"+func.getCode());
			}
			//取数据
			tx.commit();
		}catch (HibernateException e) {
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
			throw e;
		}finally{
			HibernateUtil.closeSession();
		}
	}

时间: 2024-11-05 20:36:56

hibernate基于主键的双向多对多的关联映射的相关文章

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

[原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate关系映射(二) 基于外键的双向一对一

基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 Account.cs,需要添加被控端的引用 package com.lxit.entity; import java.io.Serializable; public class Account implements Serializable{ public Account(){ } private int

hibernate映射-基于主键映射的1-1关联关系

(学习记录,错误不足之处,请您耐心指正^_^) hibernate映射-基于主键映射的1-1关联关系 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据对方的主键来生成自己的主键,自己并不独立生成主键. 一.代码示例: {类文件↓} Manager.class 1 package com.zit.hibernate.one2one.primary; 2 3 public class Manager { 4 5 private Integer mgrId; 6 private

java之hibernate之基于外键的双向一对一关联映射

这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements Serializable{ private int id; private String name; private IdCard idCard; public Person() { } public Person(String name) { super(); this.name = name;

Hibernate常用主键生成策略

1.assign:适合于应用程序维护的自然主键. 2.increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程. 3.identity:代理主键,适合于mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护. 4.sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生. 5.native:代理主键,根据底层数据库的

hibernate mapping 主键配置方式

1. 主键(id) Hibernate的主键生成策略有如下几种: 1)  assigned 主键由外部程序负责生成,在 save() 之前指定. 2)  hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源. 3)  seqhilo 与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle. 4)  increment 主键按数值顺序递增.此方式的实现机制为在当前应用实例

Hibernate自定义主键

Hibernate自定义主键,通过此方法可以解决一此特殊的主键ID,在了解自定义主键时,先了解下Hibernate有自带的10种生成主键方法. 1) assigned主键由外部程序负责生成,无需Hibernate参与. 推荐此种方法,在实体配置中修改如下: <id name="HId" type="java.lang.String"> <column name="H_ID" length="20" />