Hibernate中session方法
1. sesson的CRUD常用方法
- session.save(实体类) 保存
- session.get(实体类的字节码文件,变量id)
- session.update(实体类)
- session.delete(实体类)
查询使用query对象来查询
Query q = session.createQuery(hql)
hql是hibernate的查询语言 ( from 实体类) 不需要写selcet
相对于sql语句,在hql语句中 涉及到表中信息的,都使用实体类和类中的属性代替
List<实体类> 变量 = q.list(); //.list()表示提交操作。例如 - session.createQuery("from Person").list()
2. 一级缓存相关方法
-
close() 关闭session,说明session已经不能用了
-
clear() 清除session中的一级缓存,所有缓存在session中的数据全部被清除
区别:clear()方法session还可以用 -
evict(Object)清除一级缓存中指定的对象
-
refresh(Object) 使用数据库中的数据修改缓存的数据 同时也会修改内存对象 快照是拿缓存中的数据修改数据库 refresh拿数据库中的数据修改缓存
-
flush()手动执行快照机制 默认是在事物提交时执行快照机制
-
save和persist的区别
共同点:都把临时态变成了持久态
不同点:
save方法是hibernate提供的
persist方法是jpa规范提供的
jpa规范:java持久化api
该规范的指定有hibernate作为主导
但是,由于他是一个规范,任何支持持久化的orm框架都比寻遵循,hibernate也不能例外
最重要的区别:事物问题
如果有事物的话,两个都是执行保存(把对象有临时态变成持久态)
如果没有事物:
save方法:
Hibernate3执行保存操作,但是但是由于没有事物,则不会提交。事物会自动回滚
hibernate5会在一个内置的事物中执行
persist方法:什么都不会做 -
update和merge
1.对象从临时态变成永久态
2.对象从永久态变成托管态
3.把jvm中的内存对象的值改变
4.对象从临时态便曾永久态
5.更新托管态对象报错(因为update方法会先把托管态对象加载到以及缓存中,以及缓冲中已经存在了oid形同的对象)NonUniqueObjectException
解决办法是用merge方法
merge会把两个相同oid的对象数据合并 永远是用临时态或者托管态的对象数据改变持久态的
update时 如果更新的数据。在提交之前被其他程序删除 会报错