持久化类

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

持久化类: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. 最全面的C/C++编码规范总结

    C语言是面向过程的,而C++是面向对象的 对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性.可维护性.例如我们可以规定某 ...

  2. Java 中序列化与反序列化引发的思考?

    java 中序列化指从对象转变为 二进制流的过程中需要进行序列化,而反序列化指二进制流转换为java 对象.那么有的时候java 存储到数据库不需要序列化, 而计算机系统本质存储的就是二进制文件,数据 ...

  3. Fiddler一次性发多个请求

    Fiddler一次发送多个请求 选中某个请求: 选中 : Raw, 将request数据拷出: 包含请求header和request body 替换request header里面的ASP.NET_S ...

  4. android studio 导入主题设置,代码风格(附带eclipse 主题代码样式)

    在这里我最想说的,android studio默认主题样式,太low.不适合长时间写代码,看代码颜色不好识别,相对于背景的代码样式,我都不想吐槽了.还是网上下载主题代码样式导入样式.在这里我推荐 Su ...

  5. redhat 7.6 流量监控命令、软件(3)nethogs 监控进程实时流量

    1.解压nethogs tar -zxvpf nethogs_0.8.5.orig.tar.gz 2.直接make,这里报错,提示pcap.h,安装libpcap就可以了 3.如果已经安装,还是报错, ...

  6. 【摘录自MDN】对事件冒泡和捕捉的解释

    当一个事件触发了一个有父元素的元素(例如我们的<video>时),现代浏览器运行两个不同的阶段 - 捕获阶段和冒泡阶段. 在捕获阶段: 浏览器检查元素的最外层祖先(<html> ...

  7. Vulnhub_bossplayersCTF 记录

    目录 经验 & 总结 步骤流水 经验 & 总结 CTF这种东西还是有一些脑洞和约定俗成的东西: 比如多次编码 比如cmd参数传入执行的命令 步骤流水 端口信息搜集nmap -A 192 ...

  8. preg_replace相关问题

    preg_replace preg_replace 函数执行一个正则表达式的搜索和替换. 语法: preg_replace ( mixed $pattern , mixed $replacement ...

  9. (踩过的坑)使用Github Page搭建个人博客

    最近需要搭建一个网站,作为导航网址,但是自己的域名备案还要等上几天,就想着有没有别的办法来搭建一个公网可以访问的网站. Github Page的话是一个github个人主页,完全适合用来搭建普通网站. ...

  10. nginx 缓存

    浏览器缓存与nginx缓存 浏览器缓存 优点:使用有效缓存时,没有网络消耗,速度快:即使有网络消耗,但对失效缓存使用304响应做到网络消耗最小化 缺点:仅提升一个用户的体验 nginx 缓存 优点:提 ...