Hiroshima持久化类与主键生成策略:
Hibernate持久化类(PO)的编写规则:
1、必须提供public的无参构造
2、属性private,有public的get/set方法
3、在PO中必须有一个标识属性对应数据库的主键-->OID
Hibernate通过OID区分不同的PO类,如果内存种有两个相同的OID对象,那么Hibernate会认为是同一个对象
4、PO类的属性尽量使用基本数据类型的包装类
使用基本数据类型不能描述不存在概念,包装类是对象,默认值是null
5、PO类不能使用final修饰
hibernate中get和load方法的区别:【*****】
1、get直接获得一个持久化类型对象,立即查询
load获得持久化类的代理类型对象(子类),延迟策略查询
2、get查询不存在返回null
load查询不存在产生异常
Hibernate的主键生成策略:
自然主键:具有业务含义
代理主键: 不具有业务含义【*****】
increment:
Hibernate维护,自动生成,递增;
优点:方便跨平台;
缺点:不适合高并发访问
indenty:
底层数据库维护,自动生成,递增,-->mysql
优点:由底层数据库维护,和Hibernate无关
缺点:只能对自动增长的数据库有效
sequence:
底层数据库维护,数据库支持序列-->oracle
优点:由底层数据库维护,和Hibernate无关
缺点:数据库必须支持sequence
native:
匹配底层数据库自动选择生成策略,有Hibernate控制
优点:在项目中如果有多个数据库可以使用
缺点:效率低
uuid:【*****】
Hibernate采用128bit算法生成,唯一
优点:与数据库无关,方便数据库移植,效率高,唯一
缺点:占用空间大
assigned:
java程序生成
Hibernate持久化对象的状态:
瞬时态(临时态,自由态):
无OID,与数据库信息无关联,与Session无关联,一般指直接new出来的对象
瞬时态-->持久态:
save saveOrUpdate
瞬时态-->托管态:
手动设置OID -->一般不会这么做
持久态:
有OID,有Session管理,在数据库中可能有,可能无
持久态-->瞬时态:
delete --> 被删除后持久化对象不建议使用
持久态-->托管态:
close clear evict
托管态(游离态,离线态):
失去与Session的关联,有OID,在数据库中可能有,可能无
托管态-->瞬时态
删除OID
托管态-->持久态:
update saveOrUpdate lock(过时)
Hibernate一级缓存:Session
actionQueue 快照区
persistenceContext缓存区
Hibernate的一级缓存的目的就是为了减少对数据库的访问
持久化对象具有自动更新数据库的能力:
当事务提交,Session关闭时,向数据库发送请求,会判断一级缓存中的数据是否与快照一致,若不一致会发送update语句
一级缓存常用的API:
clear:清空一级缓存
evict:清空一级缓存中指定对象
refresh:重新查询数据库,更新一级缓存和快照
注意事项:
当对一个托管对象进行update操作时,会将托管对象转成持久对象再操作
如果session中出现相同的OID对象,会产生异常
如果托管对象的OID在数据库不存在,对象托管对象进行update操作时,会产生异常
-->先查再操作【*****】
如果删除一个托管对象,托管对象会先于session关联再删除
-->先删除一级缓存,再删除数据库数据
Hibernate的关系映射:
一对多的关系映射配置文件:(双向配置)
多.hbm.xml:
<many-to-one name="多描述一的属性名称" class="一的全路径" colume="多的外键名称"/>
一.hbm.xml:
<set name="一描述多的属性名称">
<key column="多的外键名称"/>
<one-to-many class="多的全路径"/>
</set>
想要在保存多的同时保存关联的一:
需要在多的一方配置 cascade="save-update"
想要在保存一的同时保存关联的多:
需要在意的一方配置 cascade="save-update"
双向关联维护:
在开发的使用需要双向配置;而在操作是只进行单向操作-->减少资源的浪费
-->在一的一方配置inverse="true"-->由对方维护外键
级联删除:
想要删除一的同时删除多:
需要在一的一方配置-->cascade="delete"
从session中获得一的对象和多的对象,想要从一的对象中删除多:
需要在一的一方配置-->cascade="delete-orphan"
cascade的取值:
none:默认值
save-update:当底层save update或saveOrUpdare时,级联保存临时对象,如果是托管对象,或执行update
delete:级联删除
delete-orphan:删除与当前对象解除关系的对象
all:包含了save-update delete
all-delete-orphan:包含了 delete-orphan all
扩展二级缓存:SessionFactory:
1、导入缓存jar包;
2、配置缓存文件;
3、在Hibernate核心配置文件中开启二级缓存
Hibernate持久化类(PO)的编写规则:
1、必须提供public的无参构造
2、属性private,有public的get/set方法
3、在PO中必须有一个标识属性对应数据库的主键-->OID
Hibernate通过OID区分不同的PO类,如果内存种有两个相同的OID对象,那么Hibernate会认为是同一个对象
4、PO类的属性尽量使用基本数据类型的包装类
使用基本数据类型不能描述不存在概念,包装类是对象,默认值是null
5、PO类不能使用final修饰
hibernate中get和load方法的区别:【*****】
1、get直接获得一个持久化类型对象,立即查询
load获得持久化类的代理类型对象(子类),延迟策略查询
2、get查询不存在返回null
load查询不存在产生异常
Hibernate的主键生成策略:
自然主键:具有业务含义
代理主键: 不具有业务含义【*****】
increment:
Hibernate维护,自动生成,递增;
优点:方便跨平台;
缺点:不适合高并发访问
indenty:
底层数据库维护,自动生成,递增,-->mysql
优点:由底层数据库维护,和Hibernate无关
缺点:只能对自动增长的数据库有效
sequence:
底层数据库维护,数据库支持序列-->oracle
优点:由底层数据库维护,和Hibernate无关
缺点:数据库必须支持sequence
native:
匹配底层数据库自动选择生成策略,有Hibernate控制
优点:在项目中如果有多个数据库可以使用
缺点:效率低
uuid:【*****】
Hibernate采用128bit算法生成,唯一
优点:与数据库无关,方便数据库移植,效率高,唯一
缺点:占用空间大
assigned:
java程序生成
Hibernate持久化对象的状态:
瞬时态(临时态,自由态):
无OID,与数据库信息无关联,与Session无关联,一般指直接new出来的对象
瞬时态-->持久态:
save saveOrUpdate
瞬时态-->托管态:
手动设置OID -->一般不会这么做
持久态:
有OID,有Session管理,在数据库中可能有,可能无
持久态-->瞬时态:
delete --> 被删除后持久化对象不建议使用
持久态-->托管态:
close clear evict
托管态(游离态,离线态):
失去与Session的关联,有OID,在数据库中可能有,可能无
托管态-->瞬时态
删除OID
托管态-->持久态:
update saveOrUpdate lock(过时)
Hibernate一级缓存:Session
actionQueue 快照区
persistenceContext缓存区
Hibernate的一级缓存的目的就是为了减少对数据库的访问
持久化对象具有自动更新数据库的能力:
当事务提交,Session关闭时,向数据库发送请求,会判断一级缓存中的数据是否与快照一致,若不一致会发送update语句
一级缓存常用的API:
clear:清空一级缓存
evict:清空一级缓存中指定对象
refresh:重新查询数据库,更新一级缓存和快照
注意事项:
当对一个托管对象进行update操作时,会将托管对象转成持久对象再操作
如果session中出现相同的OID对象,会产生异常
如果托管对象的OID在数据库不存在,对象托管对象进行update操作时,会产生异常
-->先查再操作【*****】
如果删除一个托管对象,托管对象会先于session关联再删除
-->先删除一级缓存,再删除数据库数据
Hibernate的关系映射:
一对多的关系映射配置文件:(双向配置)
多.hbm.xml:
<many-to-one name="多描述一的属性名称" class="一的全路径" colume="多的外键名称"/>
一.hbm.xml:
<set name="一描述多的属性名称">
<key column="多的外键名称"/>
<one-to-many class="多的全路径"/>
</set>
想要在保存多的同时保存关联的一:
需要在多的一方配置 cascade="save-update"
想要在保存一的同时保存关联的多:
需要在意的一方配置 cascade="save-update"
双向关联维护:
在开发的使用需要双向配置;而在操作是只进行单向操作-->减少资源的浪费
-->在一的一方配置inverse="true"-->由对方维护外键
级联删除:
想要删除一的同时删除多:
需要在一的一方配置-->cascade="delete"
从session中获得一的对象和多的对象,想要从一的对象中删除多:
需要在一的一方配置-->cascade="delete-orphan"
cascade的取值:
none:默认值
save-update:当底层save update或saveOrUpdare时,级联保存临时对象,如果是托管对象,或执行update
delete:级联删除
delete-orphan:删除与当前对象解除关系的对象
all:包含了save-update delete
all-delete-orphan:包含了 delete-orphan all
扩展二级缓存:SessionFactory:
1、导入缓存jar包;
2、配置缓存文件;
3、在Hibernate核心配置文件中开启二级缓存