Hibernate入门(三)
持久化类的编写规则:
1.持久化类需要提供无参的构造方法。因为在Hibernate的底层需要使用反射生成的实例。
2.持久化类的属性需要私有,对私有的属性提供共有的get和set方法。因为在Hibernate底层会将查询到的数据进行封装。
3.持久化类的属性要尽量使用包装类的类型。因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更清晰而基本数据类型不容易描述。
4.持久化类需要有一个唯一标识OID与表的主键对应。因为Hibernate中需要通过这个唯一标识OID区分在内存中是否是同一个持久化类。在Java中通过地址区分是否是同一个对象的,在关系型数据库的表中是通过主键 区分是否同一条记录。那么Hibernate就是通过这个OID来进行区分的。Hibernate是不允许在内存中出现两个OID相同的持久化对象的。
5.持久化类尽量不要使用final进行修饰。因为Hibernate中有延迟加载的机制,这个机制中会产生代理对象,Hibernate产生代理对象使用的是字节码增强技术完成的。其实就是产生了当前类的 一个子类对象实现的。如果使用了final修饰持久化类。那么就不能产生子类,从而就不会产生代理对象,那么Hibernate的延迟加载策略(是一种优化手段)就会失效。持久化类我们已经可以正常编写了,但是在持久化类需要有一个唯一标识OID与表的主键去建立映射关系,而且主键一般我们是不会让客户手动录入的,一般是我们由程序生成主键。那么Hibernate中也提供了相应的主键生成的方式。
主键生成策略:
主键的类型:
自然主键:把具有业务含义的字段作为主键,称之为自然主键。
代理主键:把不具备业务含义的字段作为主键,称之为代理主键。
Hibernate主键生成策略:
increment :用于long、short、或int类型,由Hibernate自动以递增的方式生成唯一标识符,每次增量为1。只有当没有其它进程向同一张表中插入数据时才可以使用,不能再集群环境下使用。适用于代理主键。
identity:采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型。在DB2、MySQL、MS SQL Server、Sysbase 和 HypersonicSQL数据库中可以使用该生成器、该生成器要求在数据库中把主键定义为自增长类型。适用于代理主键。
squence:Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。适用于代理主键。
native:根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo三种生成器中的一种,适合跨数据库平台开发。适用于代理主键。
uuid:Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,其UUID被编码为一个长度为32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned:由java程序负责生成标识符,如果不指定id元素的generator属性,则默认使用该主键生成策略。适用于自然主键。
Hibernate的持久化对象的三种状态
1.瞬时态
2.持久态
3.托管/游离态
瞬时状态转换成其他状态:
瞬时态的对象由new关键字创建,顺势态对象转换到其他状态总结如下:
瞬时态转换为持久态:执行Seesion的save()或saveOrUpdate()方法。
瞬时态转换为托管态:为瞬时态对象设置持久化标识OID
托管对象存在OID,但是没有Session的关联,也就是说托管态和瞬时态的区别就是OID有没有值,所以可以通过为瞬时态对象设置OID,使其变成托管态对象。
持久态对象转换到其他状态
持久化对象可以直接通过Hibernate中Session的get()、load()方法、或者Query查询从数据库中获得,持久态对象转换到其他状态总结如下:
持久态转换为瞬时态:执行Session的delete()方法,需要注意的是被删除的持久化对象,不建议再次使用.
持久态转换为托管态:执行Session的evict()、close()或clear()方法。evict()方法用于清除一级缓存中某一个对象;close()方法用于关闭Session,清除一级缓存;char()方法用于清除一级缓存的所有对象。
脱管态对象转换到其他状态
脱管态对象无法直接获得,是由其他状态对象转换而来的,脱管态对象转换到其他状态总结如下:
脱管态转换为持久态:执行Session的Update()、saveOrUpdate()或lock()方法。
脱管态转换为瞬时态,将脱管态对象的持久化标识OID设置为NULL。
脱管态和瞬时态的区别就是OID有没有值,所以可以通过将脱管态对象的OID设置为NULL,使其变成瞬时态对象。例如在session.close()操作后,加入代码customer.setCust_id(null);,customer对象将由脱管态转换为瞬时态。
《黑马》的搬运工....
Hibernate入门(三)的更多相关文章
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- hibernate入门之person表
下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...
- 史上最简单的Hibernate入门简单介绍
事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...
- Hibernate(一)之Hibernate入门
一.Hibernate入门 ssh框架体系结构 1.1.ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational ...
- Hibernate入门这一篇就够了
前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全 ...
- 走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
原文地址:Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate ...
- 三大框架之hibernate入门
hibernate入门 1.orm hibernate是一个经典的开源的orm[数据访问中间件]框架 ORM( Object Relation Mapping)对象关 ...
- Hibernate的三种状态及对象生命周期
理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
随机推荐
- Java基础知识提要
1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出Java特 ...
- 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计
一 对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...
- SQL Server 自动循环归档分区数据脚本
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/表分区 概述 在很多业务场景下我们需要对一些记录量比较大的表进行分区,同时为了保证性能需要将一些旧的数据进行归档.在分区表很多的情 ...
- kafka学习笔记——基本概念与安装
Kafka是一个开源的,轻量级的.分布式的.具有复制备份.基于zooKeeper协调管理的分布式消息系统. 它具备以下三个特性: 能够发布订阅流数据: 存储流数据时,提供相应的容错机制 当流数据到达时 ...
- 【高速接口-RapidIO】6、Xilinx RapidIO核仿真与包时序分析
提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...
- Maven - 在Eclipse中创建Maven项目
本文的前提条件: windows7-64bit jdk1.8.0 Maven-3.5.0 1- 更新Eclipse中Maven配置 1.1- 修改Eclipse根目录下eclipse.ini文件 D: ...
- 基础 jQuery 实例
基础 jQuery 实例 jQuery 原则: 由于 jQuery 是为处理 HTML 事件而特别设计的,那么当您遵循以下原则时,您的代码会更恰当且更易维护: 把所有 jQuery 代码置于事件处理函 ...
- Python字符串的格式化,看这一篇就够了
相信很多人在格式化字符串的时候都用"%s" % v的语法,PEP 3101 提出一种更先进的格式化方法 str.format() 并成为 Python 3 的标准用来替换旧的 %s ...
- 多线程的音频打标记的python实现(原创)
技术难度: ①需要一个UI界面,并且其中可进行相关参数的自调,最开始使用的是pygame的框架,后来转用tk界面: ②需要可以播放音频文件,MP3.WMA等格式: ③需要在播放音频的同时进行打标签操作 ...
- 浅尝Spring Cloud Sleuth
Spring Cloud Sleuth提供了分布式追踪(distributed tracing)的一个解决方案.其基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系.利用这些信息,可以方 ...