zoukankan      html  css  js  c++  java
  • hibernate(持久化类、主键生成策略、持久化的三种状态)

    一、hibernate的持久化类

    1、什么是持久化类:

    持久化:将数据存储到关系型数据库。

    持久化类:与数据库中的数据表建立了某种关系的java类。(持久化类=javabean+映射配置文件)

    2、持久化类的编写规则:

    (1)需要提供无参的构造方法。因为在Hibernate底层需要使用反射生成类的实例。

    (2)持久化类的属性需要私有,对私有的属性提供公有的get和set方法。

    (3)持久化类的属性要尽量使用包装类的类型。包装类的类型予以描述更清晰而基本数据类型不容易描述。

    (4)持久化类要有一个唯一标识OID与表的主键对应。(用来区分不同的对象)

    (5)持久化类尽量不要使用final修饰。

    二、hibernate的主键生成策略(记录录入时主键的生成规则)

    1、主键可以区分不同的实体,主键可以分为自然主键和代理主键:

    (1)自然主键:是一个实体的其中一条属性,比如:学生的学号,是一个字段同时也是一个主键。

    (2)代理主键:就是充当主键的字段不是实体的一个属性,但是它具有主键的功能,可以标识一个实体。例如:设置ID。

    2、主键生成策略:

    (1)native(hibernate默认):根据所使用的数据库支持能力从identity、sequence等生成策略中选择一种

       <id name="studentno" column="studentno">
                <generator class="native"></generator>
       </id>
     public static void testSel() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
                Student student=new Student();
                student.setSname("zzzz");
                student.setSex("");
                student.setBirthday("2019-11-11");
                student.setClassno("201911");
                student.setPoint(111);
                student.setPhone("1873496511");
                student.setEmail("20171514@qq.com");
                session.save(student);
                transaction.commit();
                session.close();
            }

    主键自增,不需要设置主键的值,主键必须为数字。

     (2)increment:

     <id name="studentno" column="studentno">
                <generator class="increment"></generator>
     </id>
    public static void testSel() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
                Student student=new Student();
                student.setSname("zzzz");
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setClassno("201911");
                student.setPoint(111);
                student.setPhone("1873496511");
                student.setEmail("20171514@qq.com");
                session.save(student);
                transaction.commit();
                session.close();
            }  

    由hibernate维护,主键自增,每次插入的时候,都会查询当前主键的最大值,加一后作为新的主键值。

    存在线程安全问题,只有在没有其他线程的时候才能使用。(一般不用)

    (3)sequence:Oracle的主键生成策略。

    (4)native(根据底层数据库能力不同来选择identity、sequence、hilo三种生成器中的一种),项目中如果有多种数据库的时候可以使用此方式

    (5)uuid(主键的数据类型必须为String,随机生成一个不会重复的字符串):

     <id name="studentno" column="studentno">
                <generator class="uuid"></generator>
     </id>
     public static void testSel() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
                Student student=new Student();
                student.setSname("zzzz");
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setClassno("201911");
                student.setPoint(111);
                student.setPhone("1873496511");
                student.setEmail("20171514@qq.com");
                session.save(student);
                transaction.commit();
                session.close();
            } 

     

    前面的几种都是代理主键生成策略,下面一种为自然主键生成策略。

     (6)assigned(为自然主键生成策略,需要指定主键的值,不会自动生成):

    <id name="studentno" column="studentno">
                <generator class="assigned"></generator>
     </id>
    public static void testSel() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
                Student student=new Student();
                student.setStudentno(2000000);
                student.setSname("zzzz");
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setClassno("201911");
                student.setPoint(111);
                student.setPhone("1873496511");
                student.setEmail("20171514@qq.com");
                session.save(student);
                transaction.commit();
                session.close();
            }
    

    (7)identity:主键由数据库自动生成

    三、hibernate持久化的三种状态

    1、三种状态:

    public static void testSel() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
                Student student=new Student();//瞬时态
                student.setSname("zzzz");//瞬时态
                student.setSex("男");//瞬时态
                student.setBirthday("2019-11-11");//瞬时态
                student.setClassno("201911");//瞬时态
                student.setPoint(111);//瞬时态
                student.setPhone("1873496511");//瞬时态
                student.setEmail("20171514@qq.com");//瞬时态
                session.save(student);//持久化状态
                transaction.commit();
                session.close();//游离状态
            }

    (1)瞬时态(临时态、自由态)(没有id没有与session关联)

    创建出了一个Student对象,此对象和Hibernate没有任何关系。

    (2)持久化态(有id,与session有关联),在事务没有提交之前变为持久态

    执行了session.save(student);后生成了id值,但是并未执行insert语句

    (3)游离(托管)态:有id,没有与session关联(曾经被session管理过)

    2、持久化状态的特点:

    持久化对象的任何变化都会自动同步到数据库。

  • 相关阅读:
    蚂蚁变大象:浅谈常规网站是如何从小变大的(八)(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(七)(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(六)(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(五)(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(四)(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(三)(转)
    简单的Poc Exp编写(上)
    kali渗透windowsXP过程
    [W3bSafe]Metasploit溢出渗透内网主机辅助脚本
    WannaCry勒索病毒全解读,权威修复指南大集合
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11821479.html
Copyright © 2011-2022 走看看