Hibernate_day02(2)

来源:互联网 发布:怎么才是科学家 知乎 编辑:程序博客网 时间:2024/06/03 12:34

一、持久化类


Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化就是将内存中的数据永久的保存到关系型数据库中。持久化类指的就是一个Java类


与数据库表建立了映射关系,那么这个类就称为持久化类。


二、持久化类的编写规则


(1)持久化类需要提供无参数的构造方法,因为在Hibernate的底层使用反射生成类的对象。


(2)持久化类的属性需要私有,并且私有属性提供公有的get和set方法,因为Hibernate底层会将查询到的数据进行封装。


(3)持久化类的属性要尽量使用包装类,这样可以增加语义。


(4)持久化类要有一个唯一的标识OID与表的主键对应,因为Hibernate需要通过这个唯一标识OID来区分内存中是否是同一个持久化类。


(5)持久化类尽量不要使用final进行修饰,因为Hibernate有延迟加载机制,这个机制中会产生的代理对象,Hibernate产生的代理对象使用的是字节码


的增强技术完成的,其实就是产生了当前类的一个子类对象实现的。


三、Hibernate主键生成策略



1.主键的类型:



(1)自然主键:把具有业务含义的字段作为主键


(2)代理主键:把不具备业务含义的字段作为主键


2.Hibernate的主键生成策略

(1)increment:由Hibernate管理,每次生成主键之前会查询表中ID的最大值,然后将ID值加上一作为i新的记录的ID

(2)identity:由数据库本身管理,把主键作为自增长类型

(3)sequence:Oracle中的主键生成策略

(4)native:根据底层数据库自动选择identity、sequence、hilo三种中的一种

(5)UUID:Hibernate管理,采用128位的UUID算法生成

(6)assigned:由java程序负责生成标识符,属于自然主键

四、Hibernate的持久化对象的三种状态

1.瞬时态(transient)

瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化表示OID(相当于主键值),尚未和Hibernate Session关联,在数据库中也没有记录,失去引用后将被JVM回收。瞬时状态的对象在内存中是独立存在的,与数据库中的数据没有任何关联,仅仅是一个信息的载体。

2.持久态

持久态的对象存在持久化标识OID,加入到了session缓存中,并且关联的Session没有关闭,在数据库中有对应的记录,每一条记录只对应唯一的持久化对象,需要注意的酒啊后i持久态的对象是在事务还没提交之前变成持久态的。

3.游离态或者脱管态

当某个持久态的实例与Session的关联被关闭时就变成了脱管态,游离态的对象存在持久化标识,并且仍然与数据库存在关联,只是失去了与Session的关联,需要注意的就是

游离态对象发生改变时,Hibernate是无法检测到的。

五、Hibernate持久化对象的三种状态转换

当一个对象执行new关键字后,该对象处于瞬时态;当瞬时态的对象执行session的save()或者saveOrUpdate()方法后,该对象将被放到Session的一级缓存,对象进入持久态;当持久态对象执行evict()、close()或者clean()方法后,对象进入游离态;当直接执行Session的get()、load()、find()等方法从数据库查询对象时,查询到的对象也是处于持久态;

当对数据库中的记录进行update()、saveOrUpdate()以及lock()等操作后,此时游离态的对象过渡到持久态;由于瞬时态和游离态的对象不在Session

的管理范围,所以会在一段时间后被JVM回收






原创粉丝点击