Hibernate单向多对一对象关系模型映射
单向的many-to-one
案例:
班级和学生
父亲和子女
单向:只能由其中一方维护关系
Many-to-one中有many的一方法维护或者体现两者之间的关系。
单向的many-to-one描述学生和班级的关系。
1 create table t_clazz
2 (
3 cid int primary key auto_increment,
4 cname varchar not null
5 );
6 create table t_ student
7 (
8 sno int primary key auto_increment,
9 snamn varchar,
10 cid int,
11 constraint fk_id foreign key(cid) references t_clazz(id)
12 );
3.1单向many-to-one数据库模型
数据库还是主外键关系。
3.2单向many-to-one java模型
3.3单向many-to-one配置
3.4进行crud操作
3.4.1添加班级信息
主表中添加数据
1 /***
2 * 添加班级信息
3 * ***/
4 @Test
5 public void testSaveClasses(){
6 //1获得会话session
7 Session session=sf.openSession();
8 //2开启事务
9 Transaction tr=session.beginTransaction();
10 //3进行增加操作
11 Classes cls = new Classes();
12 //cls对象封装数据
13 cls.setCname("java逆袭班");
14 session.save(cls);
15 //提交事务
16 tr.commit();
17 //释放资源
18 session.close();
19 }
3.4.2 添加学生信息(1)
将学生分配到已经存在的某个班级
1 /***
2 * 添加学生信息,同时建立和已存在班级的关系
3 * ***/
4 @Test
5 public void testSaveStudent(){
6 //1获得会话session
7 Session session=sf.openSession();
8 //2开启事务
9 Transaction tr=session.beginTransaction();
10 //创建学生对象
11 Student stu=new Student();
12 stu.setSname("逆袭的典范");
13 //查询建班级对象
14 Classes cls=(Classes) session.get(Classes.class, 1);
15 stu.setCls(cls); //建立了学生和班级的关系(cls必须包含唯一标识)
16 session.save(stu);
17 //提交事务
18 tr.commit();
19 //释放资源
20 session.close();
21 }
3.4.3添加学生信息(2)
添加学生信息,同时添加班级信息,建立关系
给many-to-one加入cascade属性=“save-update”级联保存
1 /***
2 * 添加学生信息,同时建立和新班级的关系
3 * ***/
4 @Test
5 public void testSaveStudent2(){
6 //1获得会话session
7 Session session=sf.openSession();
8 //2开启事务
9 Transaction tr=session.beginTransaction();
10 //创建学生对象
11 Student stu=new Student();
12 stu.setSname("逆袭的典范");
13 //创建班级对象
14 Classes cls=new Classes();
15 cls.setCname("盟主修炼班");
16 stu.setCls(cls); //建立了学生和班级的关系(cls必须包含唯一标识)[A1]
17 session.save(stu);
18 //提交事务
19 tr.commit();
20 //释放资源
21 session.close();
22 }
对比:如果通过one的一方关联保存many的一方,数据保存后,进行更新操作建立关系
通过many的一方关联保存one的一方法,直接执行两条insert语句,效率高。
3.4.4更新学生信息
同时更新班级信息
1 @Test
2 public void testUpdateStudent()
3 {
4 //1获得会话session
5 Session session=sf.openSession();
6 //2开启事务
7 Transaction tr=session.beginTransaction();
8 //查询学生对象
9 Student stu=(Student) session.get(Student.class, 1);
10 //修改属性
11 stu.setSname("东方必败");
12 //获得stu对象关联的班级对象
13 Classes cls=stu.getCls();
14 cls.setCname("java基础版");
15 //创建班级对象
16 session.update(stu);
17 //提交事务
18 tr.commit();
19 //释放资源
20 session.close();
21 }
3.4.5查询学生信息
同时关联该学生的班级信息
1 /***
2 * 查询学生信息
3 * 存在着延迟加载的现象.
4 * ***/
5 @Test
6 public void testSelectStudent()
7 {
8 //1获得会话session
9 Session session=sf.openSession();
10 //2开启事务
11 Transaction tr=session.beginTransaction();
12 //查询所有学生对象
13 List<Student> slist=session.createCriteria(Student.class).list();
14 //遍历学生的集合
15 for(Student s:slist)
16 {
17 System.out.println(s.getSname()+"\t\t"+s.getCls().getCname());
18 }
19 //提交事务
20 tr.commit();
21 //释放资源
22 session.close();
23 }
3.4.6删除学生信息
删除子表中的数据,直接删除。
1 /***
2 * 修改学生信息
3 * ***/
4 @Test
5 public void testDeleteStudent()
6 {
7 //1获得会话session
8 Session session=sf.openSession();
9 //2开启事务
10 Transaction tr=session.beginTransaction();
11 //查询学生对象
12 Student stu=(Student) session.get(Student.class, 1);
13 session.delete(stu);
14 //提交事务
15 tr.commit();
16 //释放资源
17 session.close();
18 }