A.概念

  持久化:将内存中的对象持久化(存储)到数据库的过程。Hibernate就是持久化的框架。

  持久化类:一个普通java对象与数据库的表建立了映射关系,那么这个类在Hiberna中被称为持久化类。(通俗一点就是java类+映射文件)

B.持久化类的编写规则

  1.对持久化类提供一个无参构造方法。

    当然,如果你什么构造都不写,默认还是有无参的。提供无参构造是为了Hibernate底层能反射生成该持久化类的实例。

  2.属性需要私有,对私有属性提供public的get和set方法。

    由于底层创建了该持久化类的实例,Hibernate就要开始设置属性的值

  3.对持久化类提供一个唯一标识的OID,与数据库主键对应。

    java中通过对象地址值是否相同区分是否是同一个对象,数据库中通过主键确定是否是同一个记录。而在Hibernate中通过持久化类的OID属性来区分是否是同一对象

  4.持久化类的属性尽量使用包装类类型。

    比如基本数据类型如int,如果是0的话,可能是默认,也可能是数值,而改成包装类型的话,默认为空,0是数值等等

  5.持久化类不要使用final进行修饰。

    首先,用final修饰的类不能继承,而Hibernate中则有一个优化手段(延迟加载),通过返回一个代理对象来管理数据,Hibernate引入的javasist的jar包可以对没有实现接口的类产生代理,主要就是通过继承这个类来实现代理,如果不能被继承,延迟加载技术就失效,load和get方法就没区别了

C.主键生成策略

  1.概念:

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

  2.主键的分类

    •   自然主键:主键的本身就是表中的一个字段。例子:比如人员表中,有人员姓名,身份证号属性。每个人都有自己的身份证,身份证号就是一个一个自然主键  
    •        代理主键:用了一个与该表不相关的字段,如id主键,这种主键叫做代理主键 

          一般用后面的代理主键。一旦自然主键参与业务逻辑编码中,后期变动可能需要修改源码。

  3.Hibernate中的主要生成策略

    •  Increment.   Hibernate中提供的自动增长机制,适用于short,int,long类型主键,在单线程程序使用,多线程会出错。首先发送一条语句 select max(id) from table,然后让id+1作为下一条记录的主键。
    •     Indentity .     适用于short,into,long类型主键,用的是数据库底层的自动增长机制。适用于有自己增长机制的数据库(mysql,mssql),注意oracle是没有自动增张机制  
    •    Sequence.    适用于short,int,long类型主键,用的是序列的方式,如oracle。
    • Uuid              适用于字符串类型主键。适用Hibernate中随机方式生成的字符串主键。
    •  native           本地策略,可以再identify和sequence之间自动切换(一般就用这个就行了)
    • assigned       Hibernate放弃外键管理,需要通过手动编写程序或者用户自己设置
    • foreign           外部的。使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

D.持久化类的三种状态。

  Hibernate为了更好的管理持久化类。将持久化类分为三种状态

  1.瞬时态(transient)

    对象没有唯一的标识OID,没有session管理。

    获取:

Customer customer = new Customer()//对象刚开始创建,没有被赋值标识OID

    状态转化:

      瞬时——>持久  save()   saveOrUpdate(Object obj)

      瞬时——>脱管  customer.setId(1L);

   2.持久态(presistent)

    对象有唯一的标识OID。有session管理

    获得:get()   load()  

    状态转化:

      持久——>瞬时:delete()

      持久——>脱管 close(),clear() evict()(清除单个对象)

   3.脱管态(Detached)

      对象有唯一的标识OID,没有被session管理

    获取:(官网没有给如何直接获取,但是可以获取)

Customer customer = new Customer();
customer.setId(1L);

    状态转化:

       脱管——>持久:  update()    saveOrUpdate()

       脱管——>瞬时   setId(null);

持久化对象的特性:

  自动跟新数据库:

    给持久化对象设置新的属性,先用get获取,再设置值,不用update,只要事务提交,也能更新数据库

   原理:Hibernate有一级缓存,会备份一份数据在Hibernate的快照区,当你在内存中改变持久化对象里面的属性值时候,会在提交后自动和快照区对比,不一样,更新数据库和快照区。(只有当你设置的值和数据库里面不一致的时候才自动更新)

Customer cust = session.get(Customer.class,1L);
cust.setName("张三");
tx.commit()

Hibernate学习——持久化类的学习的更多相关文章

  1. Hibernate的持久化类状态

    Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. 瞬时态 transient (临时态):持久化 ...

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

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

  3. hibernate的持久化类、主键生成策略

    一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...

  4. 三、hibernate中持久化类的使用

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

  5. Hibernate中持久化类与持久化对象

    1.JavaBean类 JavaBean类是实体类,必须一下属性,private修饰的成员属性,public修饰的getter与setter访问方法,public修饰的空参构造器,实现Serializ ...

  6. Java学习---InetAddress类的学习

    基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...

  7. 笔记:Hibernate 持久化类标注说明

    持久化类标注 标注 @Entity:注解声明该类是一个Hibernate的持久化类 标注 @Table:指定该类映射的表 参数 name:指定映射数据库表的名称 参数 uniqueConstraint ...

  8. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  9. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...

随机推荐

  1. Flask入门之结构重组(瘦身)-第13讲笔记

    1. pip list Flask 0.10.1 Flask-Bootstrap 3.3.5.6 Flask-SQLAlchemy 2 Flask-Script 2.0.5 Flask-WTF 0.1 ...

  2. Bagging与方差

    在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差.Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器.但Bagging为什么 ...

  3. JS响应数据

    页面中展示的信息都是存储在服务器中的数据,离开数据的页面就像是一块画板的作用,如何通过数据来描述一个页面,又怎么映射数据变化和页面渲染的关系. 当然,最直接的方法就是操作节点,页面加载之后获取节点,再 ...

  4. Selenium2Lib库之界面元素交互常用关键字实战

    5.1 Select Radio Button单选按钮关键字 按F5 查看Select Radio Button关键字的说明,如下图: Select Radio Button [ group_name ...

  5. Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

    最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上 ...

  6. Spring MVC 文件上传 & 文件下载

    索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: pom.xml WebConfig.java index.jsp upload.jsp FileUploadCon ...

  7. MySQL松散索引扫描与紧凑索引扫描

    什么是松散索引? 答:实际上就是当MySQL 完全利用索引扫描来实现GROUP BY 的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果. 要利用到松散索引扫描实现GROUP BY,需要至少 ...

  8. PAT1081:Rational Sum

    1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N ...

  9. Centos7 环境下 tty 终端 中文乱码 问题

    最近有同学问我 Centos 方面的一些操作,  由于我已经好多年不用Centos了所以比较生疏,这些年来一直都是用Ubuntu的,不得不说Ubuntu是我用过的这么多Linux系统中操作最舒服的了, ...

  10. OAuth 2 Developers Guide

    Introduction This is the user guide for the support for OAuth 2.0. For OAuth 1.0, everything is diff ...