操作持久化对象

1. Hibernate Session能够在某些时间点,按照缓存中持久化对象的属性变化来跟新数据库,这一过程称为清理缓存

2. 持久化状态,游离状态,临时状态

3. 当使用new 创建一个 Java对象时, JVM会为这个对象分配一块内存空间,只要这个对象呗引用变量引用,它就一直存在于内存中, 没有引用时,JVM垃圾回收期会在适当时候回收它占用

的内存

4. 如果希望一个JAV对象一直处于生命周期中,就必须保证至少有一个变量引用它,或者在一个JAVA集合存放了这个对象的引用

5.
session.save(customer),
customer=null

当程序中的引用变量不再引用Customer对象时,只要Session的缓存还没有被清空,Customer对像仍然处于生命周期中, 当session.load()视图从数据库中加载一个对象时,session先判断缓

存中是否已经存在这个对象,如果存在,就不在检索

6. Session缓存的作用
a. 减少数据库访问的次数
b. 保证缓存与数据库对象同步,当对象状态发生变化时,Session并不立即执行相关API,session能把相关几条SQL语句合并为一条SQL
c. 缓存中对象存在循环时,session保证不会出现访问对象死循环, save---update----delete---

7. 清理缓存的时间点
a. call commit
b. call, session.find iterator, 如果缓存中持久化对象的属性发生变化
c. call session.flush()

8. flush mode
a. AUTO b. COMMIT c. NEVER

9. 需要调用sesession.flush
a. 跟新对象时引发了触发器
b. 混合使用Hibernate API and JDBC API
c. JDBC驱动不健壮

10. 临时对象

a. 不处于Session的缓存中,也可以说,不被任何一个Session实例关联
b. 在数据库中没有对应的记录

11. 持久化对象

a. 持久化对象总是被一个Session实例关联
b. 和数据库中的记录相对应
c. session.save会把临时对象变为持久化对象
d. session.load, get 返回的对象总处于持久化状态
e. session.find返回的对象时持久化对象
f. session.update,saveorupdate(),lock, 会使游离对象变为持久化对象

12. 游离对象

a. 不位于session中
b. 是由持久化对象转变过来的
    
Customer c2 = (Customer)session.load(Customer,id); //持久化对象
session.close() //session.evict()
c2.getName() //游离对象


13. Session.save

session.save();
如果希望由程序为Customer对象指定OID,可以调用save()的另一个重载方法
save(customer, new Long(9));

save方法并不立即执行SQL insert语句, 只有当Session清理缓存时才会执行 sql insert , 如果在save()方法之后, 又修改了持久化对象属性,这会使得Session在清理缓存时,额外执行sql update语句


session.save(customer)
customer.setName("Tom") // 应该在save之前执行,增加了额外的sql
tx.commit


14. Session save 是用来持久化一个临时对象的,在应用程序中不应该八持久化对象或游离对象传给它


Customer c = new Customer();
session.save(customer);
customer.setName("tom");
session.save(customer) //这步操作是多余的


15. session.update
update也是在清理缓存时执行sql,并且会合并update sel

即使没有修改对象的属性,session在清理缓存时也会执行update语句

如果仅仅希望当修改了customer的对象的属性时,才执行update


<class name="Customer" table="CUSTOMERS" select-before-update="true">


update方法关联一个游离对象时,如果缓存中已经存在相同的OID的持久化对象,会抛出错误


Customer anotherCustomer = (Customer)session2.load(Customer2.load(Customer.class, new Long(1))

session2.update(customer) // customer id =1


以上代码会抛出错误

16. saveOrUpdate

临时对象, save
游离对象, update

Hibernate作为临时对象的条件

a. Java 对象的 OID 取值为 null
b. Java 对象具有version属性并且为null
c. 在映射文件中ID设置了 unsaved-value, 并且OID与 unsave-value的值匹配
d. 自定义了Hibernate的 Interceptor 实现类, 并且isUnsaved()方法返回Boolean.TRUE

17.
session.load, 对象不存在时抛出ObjectNotFoundException
session.get返回NULL

18. session.delete

删除级联对象

只有Session.close()时,才会从Session的缓存中删除该对象

19. cascade

none: 忽略其它对象

save-update: save,update,saveOrUpdate, 级联保存所有关联的新建的临时对象, 并且级联跟新所有关联的游离对象

delete: 删除级联的所有的关联的对象

all: save-update, delete

delete-ophan 删除所有和当前对象解除关联关系的对象

all-delete-ophan 包含all和delete-ophan

20. 假如Session的save(), update(), saveOrUpdate() 或 delete()方法会激发一个触发器, 这会导致Session缓存的数据与数据库不一致,解决办法是执行完操作后,立即调用Session的flush()和refresh(), 为了防止update引起触发器, 可以添加select-before-update="true"


tx = session.beginTransaction();
session.save(customer);
session.flush();
session.refresh(customer)
System.out.println(customer.getFRegistertime());
tx.commit();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值