持久化类

持久化:将内存中的一个对象持久化到数据库中的过程

持久化类:Java类+映射文件。Java中一个类与数据库的表建立了映射关系,那么这个类称为持久化类。

持久化类的编写规则:

  • 对持久化类提供一个无参构造,Hibernate底层需要通过反射生成实例。
  • 对属性需要私有,对私有属性提供公有的set、get方法,Hibernate中获取、设置对象的值。
  • 对持久化类提供一个唯一标识OID与数据库主键对应,Java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一个记录。HIbernate通过持久化的oid属性区分是否同一个对象
  • 持久化类的属性尽量使用包装类的类型,而不是基本数据类型,因为基本数据类型默认值是0,会有很多歧义,而包装类的默认值是null。
  • 持久化类不要用final进行修饰 ,延迟加载本身是Hibernate的一个优化的手段,返回的是一个代理对象(javasist可以对没有实现接口的类产生代理,使用了非常底层的字节码增强技术,继承这个类进行代理)如果不能被继承,延迟加载失效,load和get一致。

持久化类的三种状态(了解):

瞬时态:这种没有唯一标识oid,没有被session管理

持久态:有唯一标识oid,被session管理,持久化类的持久态的对象,可以自动更新数据库(一级缓存,后面介绍)。

脱管态:有唯一标识,没有被session管理

区分三种状态对象:

持久化类的状态转换:(了解)

瞬时态对象:

获得: Customer c = new Customer();

状态转换:瞬时转持久: session.save() , session.saveOrUpdate()

瞬时转脱管:   Customer.setCust_id(1);  瞬时与脱管的区别在于有没有oid

持久态对象:

获得:session.get , session.load : Customer customer = session.get(Customer.Class , 1 );   被session管理,有oid

状态转换:转瞬时:session.delete();

转脱管:session.close();

脱管态对象:

获得:new 一个对象,为其设置id

状态转换:转持久:update \ saveOrUpdate,有id,被session管理

        转瞬时:customer.setCust_id(null);

主键生成策略:

主键的分类:

自然主键:主键的本身是表中的一个字段(实体中一个具体的属性),比如身份证号。

代理主键:用一个与这个表不相关的字段id(PNO),这种主键称为代理主键。

实际开发当中尽量使用代理主键,一旦自然主键参与业务逻辑,后期可能需要修改源代码。好的程序的设计满足OCP原则。对程序的扩展是open的,对修改源码是close的。

Hibernate的主键生成策略:

实际开发中一般不允许用户手动设置主键,一般将主键讲给数据库,手动编写程序进行设置。在Hibernate中为了减少程序的编写,提供了很多主键的生成策略。

  • increment:Hibernate中提供的自动增长机制,适用于int、short、long。仅在单线程中使用。首先发送查询语句,然后让id+1,作为下一条记录的主键。
  • indentity:适用于short、int、long类型的主键,使用数据库底层的自动增长机制,适用于有自动增强机制数据库(MySQL),但是Oracle没有自动增长机制。
  • sequence:适用于short、int、long类型的主键,采用序列的方式,(Oracle支持序列,MySQL不行)
  • UUID:适用于字符串类型的主键,使用Hibernate中一种随机的方式生成字符串主键
  • native:本地策略,可以在indentity和sequence之间进行自动切换,注意只能是short,int , long类型的主键,不适用String类型的主键。
  • assigned:Hibernate放弃外键管理,需要通过手动编写程序或者用户自己设置。
  • Foreign:外部的,一对一的一种关联映射的情况下使用(了解)。

三 Hibernate持久化状态&主键生成策略的更多相关文章

  1. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  2. Hibernate框架的主键生成策略

    在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...

  3. hibernate框架(4)---主键生成策略

    主键生成策略 常见的生成策略分为六种 1.increment 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的 ...

  4. Hibernate入门之主键生成策略详解

    前言 上一节我们讲解了Hibernate命名策略,从本节我们开始陆续讲解属性.关系等映射,本节我们来讲讲主键的生成策略. 主键生成策略 JPA规范支持4种不同的主键生成策略(AUTO.IDENTITY ...

  5. Hibernate 表映射 主键生成策略与复合主键

    主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据 ...

  6. Hibernate的ID主键生成策略

    ID生成策略(一) 通过XML配置实现ID自己主动生成(測试uuid和native) 之前我们讲了除了通过注解的方式来创建一个持久化bean外.也能够在须要持久化的bean的包路径下创建一个与bean ...

  7. hibernate annotation 相关主键生成策略

    Hibernate 默认的全面支持 13 物种生成策略 : 1. increment 2.  identity 3. sequence 4. hilo 5. seqhilo 6. uuid 7. uu ...

  8. Hibernate -- Session的主键生成策略

    *缓存:集合--集合放置到内存中       *  只要session存在 session的一级缓存肯定存在.       *当执行查询时,以oid为oid=1条件到session的一级缓存中查找oi ...

  9. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

随机推荐

  1. kafka connector

    Kafka Connect 是一种用于在 Kafka 和其他系统之间可扩展的.可靠的的流式传输数据的工具.它使得能偶快速定义将大量数据集合移入和移除 kafka 连接器变得简单. kafka conn ...

  2. RTT之时钟管理

    时钟节拍 :等于 1/T_TICK_PER_SECOND 秒,用 SysTick_Handler实现,在每次加1时都会检查当前线程的时间片是否用完,以及是否有定时器超时.定时值应该为该值的整数倍.非整 ...

  3. Nginx常用模块及作用

    Nginx模块详解 nginx模块分为两种,官方和第三方,我们通过命令 nginx -V 查看 nginx已经安装的模块! [root@localhost ~]# nginx -V nginx ver ...

  4. input和button 高度不一致问题

    原因是 input和button的高度计算不一样, input高度不包括border. button高度包括border. 解决方法: 1.box-sizing:border-box: 2.borde ...

  5. ES 创建mapping

    mapping的写入与查看首先创建一个索引: curl -XPUT "http://erp2.es.kd1.pagoda.com.cn:80/erp_stock_index"{&q ...

  6. Centos7 [ubuntu] 安装pycharm2019.1.3并永久破解教程

    一.安装pycharm2019专业版并激活步骤 1.拉取安装包 # wget   https://download.jetbrains.com/python/pycharm-professional- ...

  7. JavaScript - 运行机制,作用域,作用域链(Scope chain)

    参考 https://www.jianshu.com/p/3b5f0cb59344 https://jingyan.baidu.com/article/4f34706e18745be386b56d46 ...

  8. CSS - 背景半透明

    就一句话 background: rgba(0, 0, 0, .2); body { background-color: pink; } div { width: 200px; height: 200 ...

  9. nginx 变量相关的map模块与split_clients模块及geo模块和geoip模块及keepalive介绍

    map 模块指令默认编译进nginx的 Syntax: map string $variable { ... } # 表示string匹配到{}里的值或变量赋值给$variable Default: ...

  10. Eclipse上将maven项目部署到tomcat,本地tomcat下,webapps下,web-inf下lib下没有jar包决绝方案

    右键项目选择properties  ,选择Deployment Assembly  , 右边点击Add 然后选择  Java Build Path Entries ,,,next  ,  选择Mave ...