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()+"		"+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 }
原文地址:https://www.cnblogs.com/guanghe/p/6094908.html