持久化类

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

持久化类: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. 【转】django 三件套(render,redirect,HttpResponse)

    Django基础必备三件套**: HttpResponse 内部传入一个字符串参数,返回给浏览器. from django.shortcuts import HttpResponse def inde ...

  2. MYSQL优化考虑十个方面

    1)索引 2)sql优化 3)锁 4)延迟 5)参数优化 6)连接数 7)cpu 8)iops 9)磁盘 10)内存

  3. 使用IDEA导入一个Maven风格的SSM项目

    转自: 方法一: (我用的这种,导入的方法 File->New->Project from existing sources)(同理,important也是一样的) https://how ...

  4. Python之时间和日期模块

    1.import time 先要导入时间模块 1)time.time()得到当前的时间,返回的是时间戳,表示自1970年1月1日起到程序运行时的秒数 import time print(time.ti ...

  5. Flask - 性能分析(Profiling,profiler,profile)

    1. 疑问 @app.cli.command() @click.option('--length', default=25, help='Number of functions to include ...

  6. PAT T1017 The Best Peak Shape

    动态规划找最长上升子序列,正反遍历一遍序列即可~ #include<bits/stdc++.h> using namespace std; ; int N; int a[maxn]; in ...

  7. js中的原生Ajax和JQuery中的Ajax

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). js中的Ajax: 参数介绍: open(String method,Str ...

  8. KVM的客户机可以使用的存储

    KVM的虚拟机可以直接使用宿主机器内的存储设备,比如可以把宿主机器内的硬盘直接暴露给 虚拟机挂载使用 -hda /dev/sfa(宿主机的设备文件) 还可以把镜像文件挂接到虚拟机,作为虚拟机的存储设备 ...

  9. Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)C

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;string s;pair<int,in ...

  10. 「AMPPZ2014」The Captain

    传送门: 这是一道bzoj权限题 Luogu团队题链接 解题思路 直接连边的话边数肯定会爆炸,考虑减少边数. 我们画出坐标系,发现一个东西: 对于两个点 \(A,B\),\(|x_A-y_A|\) 可 ...