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("");
            student.setPoint();
            student.setPhone("");
            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、持久化状态的特点:
持久化对象的任何变化都会自动同步到数据库。

hibernate的持久化类、主键生成策略的更多相关文章
- java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询
		持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ... 
- Hibernate之:各种主键生成策略与配置详解
		1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ... 
- 三 Hibernate持久化状态&主键生成策略
		持久化类 持久化:将内存中的一个对象持久化到数据库中的过程 持久化类:Java类+映射文件.Java中一个类与数据库的表建立了映射关系,那么这个类称为持久化类. 持久化类的编写规则: 对持久化类提供一 ... 
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
		俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ... 
- Hibernate框架笔记02_主键生成策略_一级缓存_事务管理
		目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ... 
- hibernate(二)主键生成策略
		hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ... 
- Hibernate的几种主键生成策略
		主键类型: 业务主键(natural key):业务主键的值是来源于一个业务数据. 代理主键(surrogate key):代理主键需要采用一种方式来生成某个唯一值. 代理主键的生成策略: 1.hib ... 
- Hibernate遇到oracle之主键生成策略
		一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ... 
- (二)JPA实体类主键生成策略
		在JPA中,配置实体类的主键的生成策略使用 @GeneratedValue @Id @Column(name = "id") @GeneratedValue(strategy = ... 
- hibernate框架学习之主键生成策略generator
		1)手工控制 assigned(不限制类型) 2)数据库自动生成 uuid(字符串类型) increment(整型数值类型) identity (整型数值类型) sequence (整型数值类型) n ... 
随机推荐
- go包管理
			摘自: http://blueskykong.com/2019/02/18/go-dep-1/ https://www.cnblogs.com/apocelipes/p/10295096.html#v ... 
- 线程池及Executor框架
			1.为什么要使用线程池?  诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过 ... 
- 《JAVA高并发编程详解》-并发编程有三个至关重要的特性:原子性,有序性,可见性
- WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?
			原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ... 
- SQLServer更新数据库每行一个随机数
			代码: ) DECLARE user_extension_cursor CURSOR FOR SELECT UserCode FROM Users OPEN user_extension_cursor ... 
- Django 信号使用问题
			Django 信号使用问题: 在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发.百度&官方文档找到了答案 1.信号的函数应该放在哪里? 这段代码应该放在哪里? 严格 ... 
- js预编译环节 变量声明提升 函数声明整体提升
			预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a) ... 
- ECharts大屏可视化【词云,堆积柱状图,折线图,南丁格尔玫瑰图】
			一.简介 参考ECharts快速入门:https://www.cnblogs.com/yszd/p/11166048.html 二.代码实现 <!DOCTYPE html> <htm ... 
- 【RMAN】TSPITR--RMAN表空间基于时间点的自动恢复
			[RMAN]TSPITR--RMAN表空间基于时间点的自动恢复 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ... 
- 【书评:Oracle查询优化改写】第五至十三章
			[书评:Oracle查询优化改写]第五至十三章 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ... 
