`
chenssy
  • 浏览: 61909 次
  • 性别: Icon_minigender_1
  • 来自: 岳阳
社区版块
存档分类
最新评论

Hibernate读书笔记-----Hibernate的关联映射之N-N关联映射 .

 
阅读更多

四、NN关联关系

1.1单向N-N的关联

单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的形式存在。

N-N关联必须使用连接表,N-N关联与有连接表的1-N关联非常相似,只需要去掉<many-to-many.../>元素的unique="true"即可。其他的配置和1-N关联一样。

由于与1-N关联非常相似,这里就不演示了。

1.2双向N-N的关联

对于双向的N-N关联,我们只需要转换为两个1-N关联模型即可。双向N-N关联两端都需要使用set集合属性,两端都增加对集合属性的访问。双向N-N同样必须使用连接表来建立两个实体之间的关联关系。

以学生、老师为例:下面为两个实体的持久化类:

Student

public class Student {
	private Integer id;
	private String name;
	private Set<Teacher> teachers;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
}

Teacher

public class Teacher {
	private Integer id;
	private String name;
	private Set<Student> students;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> students) {
		this.students = students;
	}

}

双向N-N关联的映射文件需要使用<set.../>元素,用以映射集合属性。<set.../>属性还需要增加<key.../>子元素来映射外键列,同时还应该增加<many-to-many.../>子元素来映射关联实体类。两个映射文件如下:

Student.hbm.xml

<hibernate-mapping package="com.hibernate.domain">
	<class name="Student" table="student">
		<id name="id" column="student_id">
			<generator class="native" />
		</id>
		
		<property name="name" column="student_name" />
		
		<!-- 映射N-N关联实体,两边的table应该以样 -->
		<set name="teachers" table="student_teacher">
			<!-- 映射关联的外键 列-->
			<key column="student_id" />
			<!-- 映射关联类属性 -->
			<many-to-many class="Teacher" column="teacher_id" />
		</set>
	</class>
</hibernate-mapping>


Teacher.hbm.xml

<hibernate-mapping package="com.hibernate.domain">
	<class name="Teacher" table="teacher">
		<id name="id" column="teacher_id">
			<generator class="native" />
		</id>
		
		<property name="name" column="teacher_name" />
		
		<!-- 映射N-N关联实体,两边的table应该以样 -->
		<set name="students" table="student_teacher">
			<!-- 映射关联的外键 列-->
			<key column="teacher_id" />
			<!-- 映射关联类属性 -->
			<many-to-many class="Student" column="student_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>


双向N-N关联的双边都需要指定连接表的表名,外键列的列名,所以两个<set.../>元素的table属性的值必须指定且一样。<set.../>元素的两个子元素:<key../><many-to-many.../>都必须指定column属性。<key.../><many-to-many.../>分别是指定本持久化类、关联类在连接表中的外键列。因此两边的<key.../><many-to-many.../>column属性的值应该是交叉相等。

通过下面的操作类来添加两个Student对象和两个Teacher对象

	static void add(){
		Session session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		Teacher teacher1 = new Teacher();
		teacher1.setName("teacher1");
		
		Teacher teacher2 = new Teacher();
		teacher2.setName("teacher2");
		
		Student student1 = new Student();
		student1.setName("student1");
		
		Student student2 = new Student();
		student2.setName("student2");
		
		//建立两者之间的关系
		Set<Student> ss = new HashSet<Student>();
		ss.add(student1);
		ss.add(student2);
		
		teacher1.setStudents(ss);
		teacher2.setStudents(ss);
		
		session.save(teacher1);
		session.save(teacher2);
		session.save(student1);
		session.save(student2);
		
		tx.commit();
		session.close();
	}


注意:这里只能由一边建立关联关系,就是说只能由Student对象建立与Teacher对象的关联或者由Teachert对象建立与Student对象的关联。否则将会出现主键重复错误

读李刚《轻量级JavaEE 企业应用实战》

分享到:
评论

相关推荐

    javaEE框架笔记,识货人下

    54留言管理程序_Struts + Spring + Hibernate笔记.pdf 6-Struts标签-BEAN标签笔记.pdf 7-Struts标签 -LOGIC标签笔记.pdf 8-Struts标签- HTML标签笔记.pdf 9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf

    Hibernate映射笔记

    hibernate配置关系的笔记

    J2EE三大框架_笔记_a

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    J2EE框架_笔记_c

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    hibernate学习笔记

    hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person----&gt;IdCard) 10 hibernate一对一...

    J2EE框架_笔记_b

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    hibernate笔记

    课程内容 5 1 HelloWorld 5 2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 5 ...8 将映射文件加入到hibernate.cfg.xml中 6 9 写测试类Main,在Main中对Student对象进行直接的存储测试 6 10 FAQ: 6

    Hibernate_容器映射技术笔记

    Hibernate_容器映射技术笔记Hibernate_容器映射技术笔记Hibernate_容器映射技术笔记Hibernate_容器映射技术笔记

    JPA学习笔记-EJB-04JPA关联映射总结

    感觉JPA关联映射实现感觉比Hibernate配置文件的关联映射几乎一样,只是引入了“零配置”这个概念。劣者自己在做一个东西的时候用到了关联映射,在此将它做一个总结。留给自己回顾用。

    Hibernate3 学习笔记.ppt

    Hibernate3 学习笔记.ppt ...三、Hibernate映射申明(Mapping declaration) 四、Hibernate Annotations 五、持久化对象的状态和生命周期 六、Hibernate查询 七、Hibernate最佳实践 八、Hibernate Tool

    Hibernate学习笔记

    001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 007 Hibernate 基本映射标签和属性...

    Spring和Hibernate学习笔记

    第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的方式) 第五课:spring对AOP...

    Hibernate中单一映射笔记

    Hibernate开发过程(单一映射体) 1创建持久类XXXX.java(要有oid字段:唯一且不具有业务含义;所有属性都有getter/setter方法;空的构造方法;不含oid的构造方法) 2创建映射文件XXXX.hbm.xml(包,类,id,字段) 3...

    Hibernate笔记 马士兵

    第9课 Hibernate的重点学习:Hibernate的对象关系映射 12 一、对象---关系映射模式 12 二、常用的O/R映射框架: 13 第10课 模拟Hibernate原理(OR模拟) 13 一、 项目名称 13 二、 原代码 13 第11课 Hibernate基础配置...

    hibernate配置

    DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt; &lt;hibernate-mapping package="持久化对象所在的包路径"&gt; ...

    Hibernate_映射配置文件详解.ppt

    Hibernate_映射配置文件详解,很好用的学习文件

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Java/JavaEE 学习笔记

    第三章 关联关系映射......................185 第四章 操纵持久化对象..................190 第五章 事务控制...191 第六章 高级映射...192 第七章 高级查询...196 HTML&java; script学习笔记.......................

    Hibernate - 学习笔记

    使用Hibernate对数据进行操作时会牵涉到3种类型的文件:Java类(实体类),映射文件(test.hbm.xml),数据库的表结构(表结构的创建).从理论上说只要知道其中一个,另外两个就可以从知道的那个文件中生成出来,这就涉及到先...

    hibernate初学者笔记

    关于hibernate的Session,向数据插入时的事务隔离级别,持久化对象的状态,对应关系的映射文件,表与表之间的多种映射关系,以及hibernate的二级缓存的笔记。

Global site tag (gtag.js) - Google Analytics