zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    STL容器内数据删除
    grep 同时满足多个关键字和满足任意关键字
    程序运行栈空间不足程序崩溃问题
    VS2010中设置程序以管理员身份运行
    python 包详解
    select 详解
    Hdu 1166
    CF1204C
    CF1204B
    CF1204A
  • 原文地址:https://www.cnblogs.com/guanghe/p/6094908.html
Copyright © 2011-2022 走看看