`
隐形的翅膀
  • 浏览: 497016 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

操作持久化对象

 
阅读更多
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();



分享到:
评论

相关推荐

    Hibernate操作持久化对象

    Hibernate 操作持久化对象是Java开发中用于简化数据库交互的重要工具。它是一个开源的Java持久化框架,由Gavin King创建,并逐渐发展成为Java世界中主流的持久化解决方案。Hibernate的核心在于提供对象-关系映射(ORM...

    精通Hibernate:Java对象持久化技术详解

    4. **HQL(Hibernate Query Language)**:面向对象的查询语言,类似于SQL,但更接近Java的语法,用于检索和操作持久化对象。 5. **第二级缓存**:Hibernate支持查询结果的缓存,可以显著提高系统性能,特别是对于...

    Hibernate 操纵持久化对象

    **标题:Hibernate 操纵持久化对象** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解...

    深入理解持久化对象

    ### 深入理解持久化对象 #### Hibernate与持久化对象 Hibernate作为一款优秀的Java持久层框架,其设计理念强调低侵入性,这意味着在开发过程中,可以使用标准的Java对象(POJO)进行编程,无需让POJO继承特定的...

    Hibernate持久化对象的生命周期

    此外,Hibernate提供了级联操作,允许一个持久化对象的操作影响与其关联的其他对象。例如,如果一个持久化对象包含一个临时对象,并且配置了级联保存,那么在Session清理时,这个临时对象也会被保存到数据库并变为...

    域对象在持久化层的状态

    2. **查询执行前**:当调用`Session.find()`或`Session.iterate()`方法时,如果缓存中存在对应的持久化对象,Session会首先尝试从缓存中获取,而不是直接访问数据库。若缓存中无数据,才会发起数据库查询。 #### 四...

    hibernate持久化对象生命周期[参照].pdf

    本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象(Transient Objects) 瞬时对象是指通过`new`操作符创建但尚未与数据库记录关联的Java对象...

    java类复制一个持久化对象

    在Java编程语言中,对象复制是一项常见的操作,尤其是在处理持久化对象时,为了保持数据的一致性和完整性,正确地复制对象变得尤为重要。本文将深入探讨如何利用反射机制在Java中复制一个持久化对象,理解其背后的...

    Java对象持久化的介绍等等

    在Java中,持久化主要应用于数据库操作领域,通过持久化技术,可以方便地将内存中的对象状态转换为持久存储的数据。 #### 二、Java对象持久化的意义 在Java开发中,持久化技术的重要性体现在以下几个方面: 1. **...

    精通Hibernate:Java对象持久化详解.zip

    3. **Session和Transaction管理**:讲解Hibernate的Session接口,它是与数据库交互的主要接口,负责对象的持久化操作。同时,还会涉及事务管理,包括如何开启、提交、回滚事务,确保数据的一致性。 4. **查询语言...

    hibernate:java持久化对象详解02

    本教程“hibernate:java持久化对象详解02”是系列教程的一部分,它将继续深入探讨Java中的持久化对象与Hibernate的使用方法。在开始之前,建议先学习“hibernate:java持久化对象详解01”,以确保对基础概念有清晰的...

    属性容器类的对象持久化

    ### 属性容器类的对象持久化 #### 1. 问题背景与提出 在软件开发过程中,经常遇到需要处理各种文档管理的问题。一个典型的场景是构建一个文档管理系统,该系统能够支持不同类型的文档,并且每种文档可能具有不同的...

    Java对象持久化技术概述

    Java对象持久化技术是Java应用开发中不可或缺的一部分,它不仅提供了高效的数据访问能力,还简化了数据库操作的复杂性。通过合理设计持久化层并利用像Hibernate这样的成熟框架,开发者可以构建出高性能且易于维护的...

    精通javaweb整合开发源代码

    7. 第13章重点:在“第13章 Hibernate检索与操作持久化对象.rar”中,详细讲解了如何使用Hibernate进行检索和操作数据。这可能包括HQL查询的编写、结果集的转换、分页查询、关联查询以及复杂的检索策略。通过实例...

    persistent object of dlephi

    它利用控件和数据集来直观地操作持久化对象,同时通过对象关系映射简化了数据库操作,使得在Delphi中处理数据更加便捷。对于想要深入理解和使用Delphi持久化技术的开发者来说,这是一个宝贵的资源。

    精通Hibernate:java对象持久化技术

    【精通Hibernate:Java对象持久化技术】主要涵盖了Java应用程序的分层体系结构、软件模型以及对象持久化的概念,特别是如何使用Hibernate这一ORM框架进行持久化操作。以下是详细的知识点解析: 1. **应用程序分层...

    精通Hibernate:Java持久化对象技术详解[第二版]

    总之,《精通Hibernate:Java持久化对象技术详解[第二版]》是Java开发者提升数据库操作技能,深入了解ORM技术的重要参考资料。通过学习本书,读者不仅可以熟练掌握Hibernate的使用,还能了解到如何在实际项目中优化...

    Hibernate对象持久化状态

    - **update()**:将对象重新加入缓存,变为持久化对象,计划更新操作。若对象为游离状态且未修改,可设置 `select-before-update="true"` 避免不必要的更新。 - **delete()**:删除缓存中的对象,并计划删除数据库中...

    2022年Java数据对象(JDO)的前世今生Java教程.docx

    2. **数据管理(Data Management)**:JDO提供了透明的数据管理,这意味着开发者可以像操作普通Java对象一样操作持久化对象,而JDO会在适当的时候自动处理与数据库的交互,如保存、更新和删除。 3. **查询...

Global site tag (gtag.js) - Google Analytics