`

hibernate3 小结

阅读更多

1、Configuration/SessionFactory/Session


    Configuration实例代表了一个应用程序中Java类型 到SQL数据库映射的完整集合. Configuration被用来构建一个(不可变的 (immutable))SessionFactory.
    SessionFactory是线程安全的,创建代价很高。
    Session是非线程安全的,轻量级的。一个Session对应一个JDBC连接,
    Session的connection()会获取Session与之对应的数据库连接Connection对象。
    Session的功能就是操作对象的,这些对象和数据库表有映射关系。
    Session操作的对象是有状态的,分三类:

    自由状态(transient): 未持久化,未与任何Session相关联,数据库表中没有对应的记录。
    持久化状态(persistent): 与一个Session相关联,对应数据库表中一条记录。
    游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联,数据库表中曾经有一条记录,现在还有没有就不知道了。

    游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()进行持久化。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。

 

 

    2、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法


    save()方法将指定对象保存,插入表中一条数据;
    persist()方法将指定对象保存,插入表中一条数据,我还没发现它和save方法有什么特别之处。
    replicate()方法完全使用给定对象各个属性的值(包括标识id)来持久化给定的游离状态(Transient)的实体,很暴力啊,其中还需要指定存储模式(有四种保存策略供选择)。
    update()方法将指定对象更新,更新表中一条数据;
    saveOrUpdate()方法接收一个实体对象,根据实体对象的id判断是否已经存在进行保存或更新操作,这样保存和更新方法就统一了;
    merge()方法将给定的对象的状态复制到具有相同标识的持久化对象上。
    delete()方法将指定对象删除,删除表中一条数据;

    特别注意:为了使用saveOrUpdate()方法,在由定义映射文件时,通过设定<id>标签的unsaved-value="null"来判断执行什么操作: 当id属性等于unsaved-value的值(在此为null)时,则认为还没有保存,应该执行保存操作,否则执行更新操作。这样设定之后,可以使用saveOrUpdate()方法来统一保存和更新的方法。

    <id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
        <generator class="native"/>
    </id>

    unsaved-value可以设定的值有四个:
    any:总是储存
    none:总是更新
    null:id为null时储存(预设)
    valid:id为null或是指定值时储存

 

 

    3、Session的get()/load()方法


    get()方法会总是查询实体对象,不存在时候返回null;
    load()方法也是获取一个实体对象,不存在时候抛空指针异常。

 

 

    4、Session的clear()/evict()方法


    clear()方法清除Session级别缓存中的所有实体(包括各种状态)对象,目的是释放内存。
    evict()方法清除Session级别缓存中的指定的实体(包括各种状态)对象。
    当然,Session关闭后,这些缓存也就不存在了,会等待JVM回收。

 

 

    5、Session的flush()方法


    flush()强制持久化Session缓存中的实体对象。一般还会调用clear()或evict(),目的是赶紧保存,释放宝贵内存资源。

 

 

    6、Session的commit()/rollback()方法


    commit()方法用于提交Session上的事务,否则工作单元不会对数据库产生影响。如果执行出现异常(也就是commit()失败了),则之前的操作取消,执行rollback()可撤消之前的操作。

 

 

    7、Session的close()/isOpen()/isConnected()/reconnect()方法


    close()方法关闭Session所对应数据库连接,与其相关联的对象生命周期结束。
    isOpen()方法检查Session是否仍然打开,如果Session已经断开,则可以使用reconnect(Connection connection)来重新让Session关联一个JDBC连接。
    isConnected()方法检查当前Session是否处于连接状态。

 

 

    8、Criteria、DetchedCriteria和Query接口


    Criteria和Query的实例都是和Session绑定的,其生命周期跟随着Session结束而结束。
    DetchedCriteria实例相当于一个SQL模板,目的是为了复用。其中的getExecutableCriteria(session)方法接收一个Session对象,并与之绑定,返回一个Criteria对象。

 

 

    9、Hibernate类的initialize()方法


    initialize()方法强制Hibernate立即加载指定实体所关联的对象和集合。Hibernate类中还有其他几个很有用但不适很常用的方法。

 

 

    10、映射文件中的lazy属性


    在Hibernate3中,class元素的lazy属性默认是true,如果不需要,则需要显示指定为lazy="false",否则,操作load返回的对象会抛异常。另外Hibernate3中还可以为实体属性指定lazy属性。

 

 

    12、JDBC事务和JTA事务


    Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,在Hibernate配置文件中,如果不显式指定

Transaction的工厂类别属性hibernate.transaction.factory_class的配置,则默认为JDBC事务:
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>


    在通过SessionFactory获取到Session后,与Session相关联的JDBC Connection实例就被设定为false。

    特别注意:如果数据库不支持事务,比如MySQL的MyISAM引擎的表就不支持事务,声明事务也不会起作用。要使

MySQL5的表支持事务,则可以指定表的引擎类型为InnoDB。如果是学习或者研究,目前最好还是使用PostgreSQL 8.3或DB2、Oracle。

    JDBC事务总是和一个数据库连接(或一个Session)相关联的。
    JTA事务则可以跨越多个数据连接(或多个Session),这些连接还可以是不同数据库的连接,JTA事务一般由容器进行管理。编程只要在多个操作单元的开始和结束定义JTA事务的边界即可。

    特别注意:如果使用了JTA事务,则不能再用在JDBC式的事务来管理每个Session的操作,否则会出错。为了程序的的通用性,一般来说,都是使用JTA事务来构建应用,这使用任何环境。当然,也可以使用事务代理为每个JDBC的操作方法加入事务控制。这样也为程序以后移植到JTA容器事务上带来很大方便。其实现在可以使用Spring的事务管理,与Hibernate结合的非常完美。

 

分享到:
评论
1 楼 csdn_zuoqiang 2010-08-05  


悲观锁由数据库实现,乐观锁通过version和timestamp来实现。

相关推荐

    Hibernate分页查询小结

    Hibernate分页查询小结

    spring+hibernate出错小结

    NULL 博文链接:https://tcrct.iteye.com/blog/243252

    MAPPING Hibernate方法小结.doc

    【MAPPING Hibernate方法小结】 Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库。以下是对Hibernate中几种关键概念的详细解释: 1. **对象之间的关系**: - **...

    Hibernate的框架的总结

    ### Hibernate框架技术总结 #### 一、概述 Hibernate是一个开源的对象关系映射(ORM)框架,它为Java应用提供了一种高效、灵活的方式来处理数据库交互。通过Hibernate,开发者可以使用面向对象的方式操作数据库,...

    hibernate3入门

    #### 六、小结 通过上述内容的学习,我们对Hibernate 3 的基础知识有了初步的认识,了解了它的历史背景、基本配置方法以及简单的O/R映射示例。随着深入学习,我们将探索更多高级特性,如缓存管理、事务处理以及更...

    hibernate 学习笔记小结

    ### Hibernate学习笔记小结 #### 一、简介与配置 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它允许开发人员将Java对象自动持久化到数据库表中,从而简化了数据访问层的开发工作。在Spring框架中,...

    Hibernate 框架总结

    3. 利用配置信息构建SessionFactory对象。 4. 通过SessionFactory打开Session会话。 5. 开始事务,并执行数据持久化操作。 6. 提交事务。 7. 关闭Session和SessionFactory。 使用Hibernate的原因有很多,其中...

    hibernate小结

    ### Hibernate小结 #### 一、概述 在本篇文章中,我们将对Hibernate框架进行一个较为全面的小结。主要内容包括:Hibernate映射中的Lazy加载策略、Hibernate查询语言(HQL)的使用方法,以及一些基本配置与操作技巧...

    关于Clob类型在Hibernate中 的应用小结

    3. **直接使用Clob类型**: Hibernate也支持直接使用Clob对象进行映射,这意味着在实体类中直接使用Clob类型的字段,然后在Hibernate的映射文件中进行相应的配置。这种方式适合处理大数据量的文本,因为它允许直接...

    Hibernate操作Oarcle中Clob、Blob字段小结

    这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...

    Struts2+Hibernate+Spring项目小结――Hibernate部分

    &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.Oracle9Dialect &lt;prop key="hibernate.show_sql"&gt;...

    Hibernate映射

    hibernate 映射关系 小结

    关于Clob类型在Hibernate中的应用小结.doc

    关于Clob类型在Hibernate中的应用小结.doc

    Struts2+Hibernate+Spring项目小结――Struts2部分总结

    "educationSelectItemInfos" executeResult="false" /&gt; ...在实际项目中,还需要结合Hibernate进行持久层操作,以及Spring进行依赖注入和事务管理,共同构建出完整的SSH(Struts2 + Hibernate + Spring)企业级应用。

    关于Oracle的 Clob数据类型在Hibernate中的应用小结

    在Hibernate框架中,Clob类型的字段处理是数据库操作中的一个关键环节,尤其是在处理大量文本数据时。以下是对Oracle Clob在Hibernate中应用的详细总结: 3.1 传统的JDBC方式: 在没有使用ORM框架之前,我们通常...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

Global site tag (gtag.js) - Google Analytics