zoukankan      html  css  js  c++  java
  • Hibernate 笔记 之 一 创建与配置

    1.Hibernate对象的三种状态

    瞬时态:瞬时态的对象是由new关键字开辟内存空间的对象,不存在在持久化标识OID(相当

    于主键值),并且与任何session关联

        在数据库中也没有记录,失去引用将会被JVM回收

    持久态:持久态的对象存在一个持久化标识OID,当对象加入到session缓存时,就会和session的实例对象关联。

        注意:的是持久和对象是在事务还未提交前变成持久态的

    脱管|游离态:脱管态的对象是当持久态对象与session断开时就变成脱管态

          注意:上述是正常情况,如果瞬时态直接给一个数据库存在的OID标识而未关联session对象则还是脱管态

    2.Hibernate的一级缓存和快照

    2.1一级缓存是hibernate的内置缓存其实就是session缓存,session缓存是一块内存空间,用于存放和管理Java对象。

    在使用Hibernate查找对象时首先会使用对象的OID值在Hibernate的一级缓存中寻找如果没有再去数据库中查询相应的数据

    从而减少HIbernate对数据库访问的次数。

    2.2

      当程序调用session接口的save()、update()、saveOrUpdate 时

      当程序调用load(),get()方法,以及query接口的list(),iterator()方法时

      会去查询session缓存中有没有相应的对象,在决定去不去数据库查询,查询数据库的数据加入一级缓存

      session调用close()方法时session缓存会清空,session.flush()方法数据刷入数据库

    Hibernate 快照

      Hibernate向一级缓存存入数据时会复制一份放入快照

      快照的作用是在判断数据在数据库取出和存入数据库(调用session的commit()方法)时比较数据是否发生改变

      如果改变则执行update的语句反之则不执行

    3Hibernate的关联关系的映射

      一对一:在任意一方引入对方的主键作为外键

      一对多:在“多”的一方,添加“一”的一方的主键作为外键。

      多对多:产生中间关系表,分别引入两张表的主键作为外键,两个主键成为联合主键

      反转操作(inverse)

      使某一方的放弃管理双方的关联关系

      实体类

      User类

    public class Users {
        private Integer id;
        private String username;
        private Integer age;
        private String gender;
        private ClassRoom classroom;
        private Set<Course> course = new HashSet<>();
        public Users() {}
        public Users(String username) {
            super();
            this.username = username;
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public String getGender() {
            return gender;
        }
        
        public void setGender(String gender) {
            this.gender = gender;
        }
        
        public ClassRoom getClassroom() {
            return classroom;
        }
        public void setClassroom(ClassRoom classroom) {
            this.classroom = classroom;
        }
        public Set<Course> getCourse() {
            return course;
        }
        public void setCourse(Set<Course> course) {
            this.course = course;
        }
    }

      ClassRoom类

    public class ClassRoom {
        private Integer class_id;
        private String class_name;
        private Integer number;
        private Set<Users> user = new HashSet<>();
        public Set<Users> getUser() {
            return user;
        }
        public void setUser(Set<Users> user) {
            this.user = user;
        }
        public Integer getClass_id() {
            return class_id;
        }
        public void setClass_id(Integer class_id) {
            this.class_id = class_id;
        }
        public String getClass_name() {
            return class_name;
        }
        public void setClass_name(String class_name) {
            this.class_name = class_name;
        }
        public Integer getNumber() {
            return number;
        }
        public void setNumber(Integer number) {
            this.number = number;
        }

      Course类

    public class Course {
        private Integer course_id;
        private String course_name;
        private Set<Users> user =  new HashSet<>();
        public Integer getCourse_id() {
            return course_id;
        }
        public void setCourse_id(Integer course_id) {
            this.course_id = course_id;
        }
        public String getCourse_name() {
            return course_name;
        }
        public void setCourse_name(String course_name) {
            this.course_name = course_name;
        }
        public Set<Users> getUser() {
            return user;
        }
        public void setUser(Set<Users> user) {
            this.user = user;
        }
    }

      1.一对多

      配置文件:

      一的一方:

    <hibernate-mapping package="cn.domain.demo">
        <class name="ClassRoom" table="class_room">
            <id name="class_id" column="class_id">
                <generator class="native"/>
            </id>
            <property name="class_name" column="class_name"/>
            <property name="number" column="number"/>
            <!-- name:集合的属性名
                 column:外键名
                 class:与关联的的全类名 -->
            <set name="user" inverse="true" >
                <key column="class_id"/>
                <one-to-many class="cn.domain.demo.Users"/>
            </set>
        </class>
    </hibernate-mapping>

      多的一方

    <!-- name:引用的属性名
         column:外键名
         class:全类名-->
    <many-to-one name="classroom" column="class_id" class="ClassRoom" />

    多对多

    <!-- name:集合名
                 table:中间表的表名
                 key column:给别人调用的外键名
                 class:与关联的全类名
                 colum:我调用的外键名 -->
            <set name="course" table="sys_user_course">
                <key column="user_id"/>
                <many-to-many class="Course" column="course_id"/>
            </set>

    另一方配置也就相反

    <set name="user" table="sys_user_course" inverse="true">
        <key column="course_id"/>
        <many-to-many class="Users" column="user_id"/>
    </set>

    一对多

    @Test
        //创建
        public void add() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
            //准备对象
            Users u1 = new Users();
            u1.setUsername("xjh");
            u1.setAge(14);
            u1.setGender("女");
            Users u2 = new Users();
            u2.setUsername("tjl");
            u2.setAge(16);
            u2.setGender("女");
            
            ClassRoom room = new ClassRoom();
            room.setClass_name("14sss");
            room.setNumber(27);
            //建立关系
            u1.setClassroom(room);
            u2.setClassroom(room);
            //如果配置inverse则无需写
            /*room.getUser().add(u1);
            room.getUser().add(u2);*/
            //保存
            session.save(room);
            session.save(u1);
            session.save(u2);
            
            tx.commit();
            
        }
    添加数据
    @Test
        //修改
        //将其中的一个人换一个班级
        public void move() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
        
            Users users = session.get(Users.class, 1);
            ClassRoom classRoom = session.get(ClassRoom.class, 1);
            //先解除关系
            classRoom.getUser().remove(users);
            users.setClassroom(null);
            
            ClassRoom room = new ClassRoom();
            room.setClass_name("1488");
            room.setNumber(27);
            //设置新关系
            users.setClassroom(room);
    //        room.getUser().add(users);
            
            session.save(room);
            tx.commit();
            
        }
    修改数据
     1 //删除
     2     @Test
     3 public void remove() {
     4     Session session = HibernateUtils.getCurrentSession();
     5     Transaction tx = session.beginTransaction();
     6     Users users = (Users) session.createCriteria(Users.class)
     7              .add(Restrictions.eq("username", "tjl"))
     8              .uniqueResult();
     9 //    ClassRoom  classRoom = session.get(ClassRoom.class, 1);
    10 //    classRoom.getUser().remove(users);
    11     users.setClassroom(null);
    12         
    13     session.delete(users);
    14         
    15     tx.commit();
    16         
    17 }
    删除数据

    多对多

     1 @Test
     2 public void init() {
     3     Session session = HibernateUtils.getCurrentSession();
     4     Transaction tx = session.beginTransaction();
     5     Users u1 = session.get(Users.class,1);
     6     Course c1 = new Course();
     7     c1.setCourse_name("语文");
     8     Course c2 = new Course();
     9     c2.setCourse_name("英语");
    10         
    11     u1.getCourse().add(c1);
    12     u1.getCourse().add(c2);
    13     session.save(u1);
    14     session.save(c1);
    15     session.save(c2);
    16     tx.commit();
    17 }
    初始添加数据
     1 @Test
     2 //为某个学生添加课程
     3 public void add() {
     4     Session session = HibernateUtils.getCurrentSession();
     5     Transaction tx = session.beginTransaction();
     6     session.get(Users.class, 2)
     7           .getCourse()
     8           .add((Course) session.createCriteria(Course.class)
     9           .add(Restrictions.eq("course_name", "语文"))
    10           .uniqueResult());
    11         tx.commit();
    12 }
    添加
     1 @Test
     2     //删除学生的一门课
     3 public void remove() {
     4     Session session = HibernateUtils.getCurrentSession();
     5     Transaction tx = session.beginTransaction();
     6     Users user = (Users) session.createCriteria(Users.class)
     7                .add(Restrictions.eq("username", "xjh"))
     8                .uniqueResult();
     9      user.getCourse()
    10          .remove(session.createCriteria(Course.class)
    11          .add(Restrictions.eq("course_name", "语文"))
    12          .uniqueResult());
    13     tx.commit();
    14 }
    移除
  • 相关阅读:
    GDC2017:Framegraph-extensible-rendering-architecture-in-frostbite
    17072802(UE4的批量Import)
    16011301(统计指令数影响耗时)
    16080401(面向摄像机的Instance模型)
    UE4编译_201701
    17020701(AnimDynamic继续)
    Python过滤utf8mb4无效字符
    Windows下安装MySQL-python
    使用Pycharm更新Github项目(到源项目)
    python异常:error: command 'gcc' failed: No such file or directory
  • 原文地址:https://www.cnblogs.com/FlyBlueSky/p/9146112.html
Copyright © 2011-2022 走看看