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 ...
随机推荐
- :阿里巴巴 Java 开发手册 (十一)工程结构
(一) 应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于 Web 层,也可以直接依赖于 Service 层,依此类推: 开放接口层:可直接封装 Se ...
- 浮动IP地址(Float IP)与 ARP欺骗技术
浮动IP地址: 一个网卡是可以添加多个IP的. 就是多个主机工作在 同一个集群中,即两台主机以上.每台机器除了自己的实IP外,会设置一个浮动IP,浮动IP与主机的服务(HTTP服务/邮箱服务)绑在一起 ...
- k8s与监控--k8s部署grafana6.0
原文参考:https://segmentfault.com/a/1190000018335241
- 换个语言学一下 Golang (6)——控制流程
Go语言的控制结构关键字只有if..else if..else ,for 和 switch. 而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定.看下下面的例子. 请比较一下A程序和B程 ...
- 单词dyamaund钻石dyamaund英语
dyamaund 英文词汇,中文翻译为金刚石的;镶钻;用钻石装饰 中文名:镶钻;钻石装饰 外文名:dyamaund 目录 释义 dyamaund 读音:[?da??m?nd, ?da?m?nd] ...
- 四级CET大学词汇六级备份
Cet6六级中要考到法庭词汇的小故事 如何安排六级考试前的一个月1.每天按照我的要求去背单词2.做四套真题,词汇部分 只做词汇 3.做personal dictionary把真题中出现的所有不认识的 ...
- 因改漏洞而引申了解的Cookie机制!
近期因为修改漏洞:Appscan扫描漏洞:加密会话(SSL)Cookie中缺少Secure属性,而涉及到Cookie有关的知识,现结合该漏洞的修复过程和了解的cookie知识总结一下. 一.加密会话( ...
- 给用过SAP CRM中间件的老哥老姐们讲讲SAP CPI
最近Jerry由于项目需要,又得学习一个新工具:SAP Cloud Platform Integration,简称CPI,以前又叫做HCI - HANA Cloud Platform Integrat ...
- 图说jdk1.8新特性(1)--- 函数式接口
函数式接口 总结起来就以下几点: 如果一个接口要想成为函数接口(函数接口可以直接用lambda方式简化),则必须有且仅有一个抽象的方法(非default和static) 可以通过注解@Function ...
- Windows环境下的MYSQL5.7配置文件定位
1.MYSQL安装目录 select @@basedir; 2.MYSQL数据文件目录 select @@datadir; 3.相应地,配置文件在数据文件上一级目录中 4.停止MYSQL服务 net ...