Hibernate映射(四)— 一对多

一对多与多对一区别:

映射原理是一致的,都是在多的一端加入一个外键,指向一的一端

区别在于维护的关系不同:

多对一维护的关系是:多指向一的,有了此关系,在加载多的时候可以将一加载上来

一对多维护的关系是:一指向多的关系,有了此关系,加载一

的时候可以将多加载上来

单向

适用情况:一个班级有多个学生(班级依赖学生,必须先有学生,班级维护关系)

关系图:

注:都是在多的一端加上外键,指向一的一端

<span style="font-size:18px;">实体:
	Student:
		public class Student {

			private int id;

			private String name;

			public int getId() {
				return id;
			}

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

			public String getName() {
				return name;
			}

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

	Class:
		public class Classes {

			private int id;

			private String name;

			private Set students;

			public int getId() {
				return id;
			}

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

			public String getName() {
				return name;
			}

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

			public Set getStudents() {
				return students;
			}

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

		}
映射文件:
   Student:
	<hibernate-mapping>
	    <class name="com.bjpowernode.hibernate.Student" table="t_student">
		<id name="id">
		     <generator class="native"/>
		</id>
		<property name="name"/>
	    </class>
	</hibernate-mapping>
    Class:
	<hibernate-mapping>
	     <class name="com.bjpowernode.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students">
	        <key column="classesid"/>
		    <one-to-many class="com.bjpowernode.hibernate.Student"/>
		</set>
	     </class>
          </hibernate-mapping>
客户端:
	public void testSave2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Student student1 = new Student();
			student1.setName("张三");
			session.save(student1);

			Student student2 = new Student();
			student2.setName("李四");
			session.save(student2);

			Classes classes = new Classes();
			classes.setName("动力节点");

			Set students = new HashSet();
			students.add(student1);
			students.add(student2);
			classes.setStudents(students);

			// 可以成功保存数据
			// 但是会发出多余的update语句来维持关系
			session.save(classes);
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}</span>

结果:

双向

适用情况:

两端都知道关系,解决一对多单向关联的缺陷

关系图:

<span style="font-size:18px;">实体:
student:
	public class Student {

		private int id;

		private String name;

		private Classes classes;

		public int getId() {
			return id;
		}

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

		public String getName() {
			return name;
		}

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

		public Classes getClasses() {
			return classes;
		}

		public void setClasses(Classes classes) {
			this.classes = classes;
		}
	}
class:
	public class Classes {

		private int id;

		private String name;

		private Set students;

		public int getId() {
			return id;
		}

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

		public String getName() {
			return name;
		}

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

		public Set getStudents() {
			return students;
		}

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

	}

映射文件:
student:
   <hibernate-mapping>
      <class name="com.bjpowernode.hibernate.Student" table="t_student">
	<id name="id">
		<generator class="native"/>
	</id>
	<property name="name"/>
	<many-to-one name="classes" column="classesid"/>
       </class>
    </hibernate-mapping></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">class:</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">        <hibernate-mapping></span></span>
<span style="font-size:18px;">       <class name="com.bjpowernode.hibernate.Classes" table="t_classes">
	   <id name="id">
		<generator class="native"/>
	   </id>
	   <property name="name"/>
	   <set name="students" inverse="true">
		<key column="classesid"/>
	        <one-to-many class="com.bjpowernode.hibernate.Student"/>
	   </set>
	</class>
</hibernate-mapping></span>

客户端:

  <span style="font-size:18px;"> 情况1:
	public void testSave2() {
	    Session session = null;
	    try {
		session = HibernateUtils.getSession();
		session.beginTransaction();
		Student student1 = new Student();
		student1.setName("张三");
		session.save(student1);

		Student student2 = new Student();
		student2.setName("李四");
		session.save(student2);

		Classes classes = new Classes();
		classes.setName("动力节点");

		Set students = new HashSet();
		students.add(student1);
		students.add(student2);
		classes.setStudents(students);

	       //可以成功保存数据
		//但是会发出多余的update语句来维持关系
		session.save(classes);
		session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
	        finally {
			HibernateUtils.closeSession(session);
		}
	}</span>

注:可以保存数据,但会发出多余的update语句来维护关系

情况2:

<span style="font-size:18px;">public void testSave3() {
	Session session = null;
	try {
	<span style="white-space:pre">	</span>session = HibernateUtils.getSession();
		session.beginTransaction();

		Classes classes = new Classes();
		classes.setName("动力节点");
		session.save(classes);

		Student student1 = new Student();
		student1.setName("张三");
		student1.setClasses(classes);
		session.save(student1);

		Student student2 = new Student();
		student2.setName("李四");
		student2.setClasses(classes);
		session.save(student2);

		session.getTransaction().commit();
	       catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}

}</span>

结果:

时间: 2024-08-19 05:08:04

Hibernate映射(四)— 一对多的相关文章

千山万水之Hibernate(六)——关联映射(一对多)

学习Hibernate的过程中,映射是比较重要的一部分,再说其中哪一种映射比较重要(或可以说是比较常用)呢?那一定很多人会想到一对多关联映射.之所以这样说,是因为在生活中很多这样的实例:班级-学生.企业-员工.文件夹-文件.试卷-题目等.至于生活中为什么会遇到这样大量一对多的情况,似乎是哲学方面的事情了,当然大家可以继续思考,而我们今天主要讨论Hibernate中的一对多. 原理分析 我们仍然拿班级.学生之间的关系做例子:一个班级包含多个学生.相应的实体关系图为: 单向关联 由图可知,由于单向的

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持久化类的属性的名字 column: 设定和持久化类的属性对应的表的外键 class:设定待映射的持久化类的属性的类型 建立1所对应的封装类,这儿只写属性,setter和getter就不写了: private Integer customerId; private String customerName; 建立

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

上上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息. 上篇博文[SSH进阶之路]Hibernate映射--一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载.下面我们开始今天的内容: 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,

Hibernate复习(四)常见的映射类型A

1.many-to-one 属性如下: ? name:设定待映射的持久化类的属性名. ? column: 设定和持久化类的属性对应的表的外键. ? class:设定持久化类的属性的类型. 2.set <set>元素包括以下属性: – name: 设定待映射的持久化类的属性名 – cascade: 当取值为"save-update",表示级联保存和更新. – inverse:当取值为"true",表示在双向关联中,这一端为镜像端. ? <set>

Hibernate映射关系之一对多

1.双边使用的比较多,所以这里用双边的一对多:一个商店包含多个优惠券,一个优惠券对应一个商店 Store.java(商店) @OneToMany(mappedBy="store",cascade = {CascadeType.REMOVE }) private Set<Coupon> coupons=new HashSet<Coupon>(); (1)mappedBy="store"是在Coupon类中的Store的变量名称 (2)Casca

Hibernate One-to-Many Mappings 一对多关系映射

Hibernate One-to-Many Mappings 一对多关系映射 关键点:一对多关系使用 Set 实现, 例子:一个员工可以有多个学证书. Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 创建Hibernate的配置文件(h

Hibernate之关于一对多,多对一双向关联映射

[Hibernate]之关于一对多,多对一双向关联映射 由于一对多,和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name="t_group") publicclass Group { private Integer id; private String name; private Set<Person> persons=newHashSet<Person>();//set不允许重复,最适合数

hibernate之关于一对多单向关联映射

[hibernate]之关于一对多单向关联映射 基于外键的一对多关联映射!一对多,Group(组)对于Person(人),一个组可以有多个人!ok? Hibernate主要有两种配置方法,一种是Annotations 一种是XML! 下面是Annotations的配置方法! @Entity @Table(name="t_group") publicclass Group { private Integer id; private String name; private Set<

hibernate入门三之关联映射(一对多和多对一)

提示:本文的操作是在入门一和二上面的 hibernate对映射类型 在开始是学习的时候,我以为一对多和多对一是同样的,后来发现不是这样,比如说班主任和班级里的学生,一个班级可能有多个学生,但是只有一个班主任,学生和班主任的关系是多对一,班主任和学生的关系是一对多,两者之间的区别在于它们的指向性 一对一(one-to-one ) 一对多(ont-to-many) 多对一(many-to-one) 多对多(many-to-many) 一对多(ont-to-many)和多对一(many-to-one)