1.Hibernate中的常用方法的特点:
a.save()和persist()
save()和persist()在有事务的情况下,执行是没有区别的;在没有事务的情况下,save()先执行,再回滚,persist()根本就不会执行
b.get()和load()
b.1在没有查到数据的时候,get()方法会出现NullPoniterException异常,load()方法会出现ObjectFoundException的异常
b.2load()方法在进行数据查询的时候会使用 延迟加载,get()方法在进行数据查询的时候是及时加载
延迟加载?
只有在真正的使用到查询出的对象的资源的时候(对象中的属性或者方法),hibernate才会去查询数据
c.saveorupdate()什么情况下是添加数据,什么情况下会更新数据
在操作数据的对象中,如果对象中含有主键值那么执行的就是update操作,没有主键值执行的就是save操作,但是可以再映射文件中进行修改
<!-- any:总是储存 none:总是更新 null:id为null时储存(默认) --> <id name="id" column="id" unsaved-value="none"> <!-- 主键生成策略 native自动匹配策略--> <generator class="native"/> </id> |
2.HIbernate持久化对象的什么周期
对象什么周期会有3个状态
Transient(瞬时):在new对象后,在该状态下对象的特点是对象还没有与数据库发生任何的关系,不对应于数据库中的任一条记录;在持久状态下调用delete()方法,该对象会重新回到瞬时状态
Persistent(持久):调用get()或者load()方法的时候会进入持久状态;在持久状态下对象和数据库的记录都是一一对应的,在session没有被关闭的情况下,对象的任何变化都会自动同步到数据库中;在瞬时状态下调用save()或者saveorupdate()方法对象会进入持久状态,在离线状态下调用update()或者saveorupdate()方法对象会进入持久状态
Detached(离线)在持久状态下调用evict()clear()close()方法的时候,对象会进入离线状态;对象之任何属性变动,不会对数据库中的记录造成任何的影响
3.Hibernate的缓存机制
(1)缓存内存机制?
但第一次查询数据的时候,hibernate会先检查在缓存中是否存放有需要查询的数据,如果有就直接从缓存中取出数据,如果没有,再到硬盘中去查找需要的数据的时候,会把该数据备份到缓存当中
(2)hibernate中的缓存分为一级缓存(session缓存)和二级缓存(sessionFactory缓存)
session缓存:这种缓存机制只在session的一次打开和关闭周期有效,session缓存是默认开启的
sessionFactory缓存:这种缓存机制只在sessionFactory的一次打开和关闭周期有效,二级缓存是需要手动配置开启的。
问题:
session缓存和sessionFactory缓存同时开启的时候,缓存机制是》
当第一次查询数据的时候,hibernate会先检查在一级缓存中是否存放有需要查询的数据,如果有就直接从缓存中取出数据,如果没有,检查在二级缓存中是否存放有需要查询的数据,如果有就直接从缓存中取出数据,如果也没有再到硬盘中去查找需要的数据,当查找到需要的数据的时候,会把数据备份到一级缓存以及二级缓存当中。
4.对象识别
可以根据需要自己编写一套识别对象的方式(比如:根据对象的id属性,或者name属性进行比较)而不是用对象地址比较
重写实体类中的equals()和hashcode()方法。