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、持久化状态的特点:

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

原文地址:https://www.cnblogs.com/zhai1997/p/11821479.html