hibernate进阶(6) 一对多映射

注意这里使用hibernate4.3.11的jar包

映射类型:

一对多(one-to-many)

多对一(many-to-one)

一对一(one - to -one)

多对多(many-to-many)

常用的是一对多和多对一的映射

下面学习一对多映射类型

比如:一个班级有多个学生

在数据库中:可以通过添加主外键的关联(学生表中添加外键指向班级),表现一对多的关系

在Hibernate和java中:通过一方持有多方的集合实现,即在“一”的一端使用<set>元素表示持有“多”的

一端的对象(即通过集合的方式)

注意这里使用hibernate4.3.11的jar包

创建Hibernate的工具类:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;


public class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static Session session;

	static{
		//创建Configuration 读取hibernate.cfg.xml文件,完成初始化
		Configuration config = new Configuration().configure();
		StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(config.getProperties());
		StandardServiceRegistry ssr = ssrb.build();
		sessionFactory = config.buildSessionFactory(ssr);
	}
	//获取SessionFactory
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
	//获取session
	public static Session getSession(){
		session = sessionFactory.openSession();
		return session;
	}
	//关闭session
	public static void closeSession(Session session){
		if(session!=null){
			session.close();
		}
	}
}


下面是使用sql语句创建表的方式(没兴趣的请跳过)。可以使用Hibernate tools工具自动生成,还是hibernate tools工具比较爽

学点mysql语句:如下的sql语句是创建班级表grade和学生表student,最后一句

alter table student add constraint fk_student_gid foreign key (gid)
references grade(gid);

是给学生表添加外键gid对应主表grade表的主键gid。其中fk_student_gid是外键的名字

create table grade
(
	gid int primary key,
	gname varchar(20) not null,
	gdesc varchar(50)
);

create table student
(
	sid int primary key,
	sname varchar(20) not null,
	sex char(2),
	gid int
);

alter table student add constraint fk_student_gid foreign key (gid)
references grade(gid);

使用sqlyog管理工具执行上面的sql语句创建表



执行sql语句创建成功



创建学生类:

package com.edu.hpu.model;

public class Student {
	private int sid;
	private String sname;
	private String sex;
	public Student(){

	}

	public Student(String sname, String sex) {
		super();
		this.sname = sname;
		this.sex = sex;
	}

	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}


创建班级类

package com.edu.hpu.model;
import java.util.HashSet;
import java.util.Set;


public class Grade {
	private int gid;
	private String gname;
	private String gdesc;//班级详细信息
	//在一方定义一个多方的集合
	private Set<Student> students = new  HashSet<Student>();

	public Grade() {
		super();
	}
	public Grade( String gname, String gdesc) {
		super();
		this.gname = gname;
		this.gdesc = gdesc;
	}

	public Grade(int gid, String gname, String gdesc, Set<Student> students) {
		super();
		this.gid = gid;
		this.gname = gname;
		this.gdesc = gdesc;
		this.students = students;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}
	public int getGid() {
		return gid;
	}
	public void setGid(int gid) {
		this.gid = gid;
	}
	public String getGname() {
		return gname;
	}
	public void setGname(String gname) {
		this.gname = gname;
	}
	public String getGdesc() {
		return gdesc;
	}
	public void setGdesc(String gdesc) {
		this.gdesc = gdesc;
	}
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
}

使用hibernate tools工具自动生成映射文件(主键都改为自增)

 <generator class="increment" />

然后在配置文件中添加

<!-- 指定映射文件的路径 -->(这里我是栽了坑的,一定要仔细检查格式)

<mapping resource="com/edu/hpu/model/Student.hbm.xml" />
<mapping resource="com/edu/hpu/model/Grade.hbm.xml" />

表的生成策略改为update

<property name="hbm2ddl.auto">update</property>


创建测试类添加测试方法

package com.edu.hpu.test;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.hpu.model.Grade;
import com.edu.hpu.model.Student;
import com.edu.hpu.util.HibernateUtil;

public class test {
		private  Session session;
		private  Transaction tr;
	
		@Before
		public  void init() {
			session = HibernateUtil.getSession();
			tr = session.beginTransaction();
		}
	
		// 单向一对多关系(班级--》学生)
		@Test
		public  void add() {
			Grade g = new Grade("Java一班", "Java一班软件开发");
			Student stu1 = new Student("小明", "男");
			Student stu2 = new Student("小芳", "女");
	
			// 如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
			g.getStudents().add(stu1);
			g.getStudents().add(stu2);
			session.save(g);
			session.save(stu1);
			session.save(stu2);
			tr.commit();
	
		}
	
		@After
		public  void destory() {
			HibernateUtil.closeSession(session);
		}
	
}


最后执行

红色标记的是对应的,student表设置的外键


查询学生的测试方法:

//查询班级中包含的学生
		@Test
		public void findStudentByGrade(){
			Grade grade = (Grade) session.get(Grade.class, 1);
			System.out.println(grade.getGname()+","+grade.getGdesc());
			
			Set<Student> students = grade.getStudents();
			for (Student student : students) {
				System.out.println(student.getSname()+","+student.getSex());
			}
		}
	

执行结果


修改学生信息添加到一个新的班级,

//将学生添加到一个新的班级中
		@Test
		public void update(){
			Grade g = new Grade("java二班","java软件开发二班");
			Student stu = (Student) session.get(Student.class, 1);
			g.getStudents().add(stu);
			session.save(g);
		}
执行结果:

新增了软件二班

原来在一班的学生添加到了二班


删除学生操作

//删除学生信息
		@Test
		public void delete(){
			Student stu = (Student) session.get(Student.class, 1);
			session.delete(stu);
		}

这里有栽了个坑(@Test注解一定不要忘了写,不然报错

增删改查测试全部代码


package com.edu.hpu.test;

import java.util.Date;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.hpu.model.Grade;
import com.edu.hpu.model.Student;
import com.edu.hpu.util.HibernateUtil;

public class test {
		private  Session session;
		private  Transaction tr;
	
		@Before
		public  void init() {
			session = HibernateUtil.getSession();
			tr = session.beginTransaction();
		}
	
		/**
		 *  单向一对多关系(班级--》学生)
		 *  建立关联关系后,可以方便的从一个对象导航到另一个对象
		 *  注意关联的方向
		 */
		@Test
		public  void add() {
			Grade g = new Grade("Java一班", "Java一班软件开发");
			Student stu1 = new Student("小明", "男");
			Student stu2 = new Student("小芳", "女");
	
			// 如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
			g.getStudents().add(stu1);
			g.getStudents().add(stu2);
			session.save(g);
			session.save(stu1);
			session.save(stu2);
			
	
		}
		//查询班级中包含的学生
		@Test
		public void findStudentByGrade(){
			Grade grade = (Grade) session.get(Grade.class, 1);
			System.out.println(grade.getGname()+","+grade.getGdesc());
			
			Set<Student> students = grade.getStudents();
			for (Student student : students) {
				System.out.println(student.getSname()+","+student.getSex());
			}
		}
		//将学生添加到一个新的班级中
		@Test
		public void update(){
			Grade g = new Grade("java二班","java软件开发二班");
			Student stu = (Student) session.get(Student.class, 1);
			g.getStudents().add(stu);
			session.save(g);
		}
		//删除学生信息
		@Test
		public void delete(){
			Student stu = (Student) session.get(Student.class, 1);
			session.delete(stu);
		}
	
		@After
		public  void destory() {
			tr.commit();
			HibernateUtil.closeSession(session);
		}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值