`
morris
  • 浏览: 179048 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate3.X 实践总结

阅读更多
   Hibernate不是盏省油的灯,也不是想像的射来射去很简单的事。有很多细节处理不好会让你很不舒服的,这方面最突出的表现在两方面:一是事务管理,是JTA事务还是JDBC事务?幸亏有了Spring和J2EE容器;二是胡乱映射,模型关系建立不合理或者错误导致,或者是映射策略和技术不过关导致。这样的最终结果是抛出一堆HibernateException,摸不着头脑。下面是我实践中的一些总结作为备忘录写出来。参考的是最新的Hibernate 3.2.6GA API文档,还吸收了Hibernate牛人(夏新)写的书和翻译中文开发手册的精华。

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()、0saveOrUpdate()、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属性。

11、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结合的非常完美。




分享到:
评论
8 楼 icewubin 2008-05-22  
我实际使用的结果是,这么多操作,合适的并不是很多,也不太希望公司的新人把这些方法全记住,还没完全想清楚,目前只用save、update、refresh、evict、delete、load、get(测试的时候用)。
像saveOrUpdate我是很排斥的,具体理由还未理清楚,比如调试不方便,业务含义不明确,架构需求根本不需要这种操作。merge也是如此,SNA设计思想的架构我怎么也想不出需要这种东西。

提醒一点,save使得对象的ID有值,但是没有代理性质,所以想要马上得到代理性质,又不能通过返回,而要更改引用的话(我还真碰到这种需求):
session.save(model);
session.flush();
session.refresh(model);
不过从内存跟踪的结果来看,和load得到的对象还是有点不一样的,也可能一样,有兴趣大家debug跟一下,呵呵。
7 楼 igogo007 2008-05-19  
楼主讲的很好。
6 楼 laiseeme 2008-05-18  
上面说的也对  书上说的就是这种  但是jiyanliang 说的更全面些  回去再坐坐测试就知道了
5 楼 wangxin0072000 2008-05-18  
我一直在使用hibernate2
发现get 与load的区别主要是load时,如果数据库中没有此id的记录时,返回异常,而get返回null
由于hibernate2默认lazy load为false,所以没有注意过返回的对象中是否为代理
4 楼 laiseeme 2008-05-18  
看了get和load的补充  理解了好多   还是有spring好 很多东西都叫给他管理,大大简化了hibernate的使用
3 楼 CoolinZ 2008-05-18  
使用get或load要小心 
load可以提高缓存使用效率 但由于是代理 所以在后面操作会更容易出现问题
get是直接访问db 所以cache的作用就没了 但会马上得到结果 麻烦少,但频繁调用势必对服务器压力增加

2 楼 morris 2008-05-09  
非常感谢楼上给的补充 我现在彻底明白了
1 楼 jiyanliang 2008-05-09  
persist()方法无返回值,save()方法返回对象标识符。
persist()方法只能保存暂态和持久态的对象,save()方法能保存任何状态对象。
共同点:调用完方法后,对象的状态都变成持久态。

get()方法返回对象的实例,而对于load()方法,如果在持久化上下文存在该标识符的对象,就返回该对象的实例,否则返回对象的代理,该代理对象只含有对象标识符。

相关推荐

    hibernate4.x jar

    总结,Hibernate4.x不仅简化了数据库操作,还提供了丰富的查询API和全文搜索功能。通过理解和熟练掌握其核心组件,开发者可以更高效地进行数据库交互,提升开发效率。而深入学习和实践,如利用Hibernate Search实现...

    Hibernate3.x简单配置示例

    **Hibernate3.x简介** Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用面向对象的方式来操作数据库。在Hibernate3.x版本中,它提供了更为完善的对象...

    Struts1.3+Spring4.x+Hibernate4.x框架整合实现对书籍的增删改查(含分页)

    总结来说,"Struts1.3+Spring4.x+Hibernate4.x框架整合实现对书籍的增删改查(含分页)"项目展示了如何使用SSH框架来构建一个功能完善的书籍管理系统。Struts处理用户请求,Spring管理应用组件并提供事务支持,...

    客户关系管理系统。hibernate5.2.x+struts2.3.x+spring4.3+Mysql5.zip

    总结来说,这个项目涵盖了Java Web开发的核心技术,通过SSH框架实现了客户关系管理,同时可能融入了人工智能元素,是学习和实践现代企业级应用开发的好材料。对于想要深入理解Java Web开发、ORM框架、MVC设计模式...

    Struts1.x-Hibernate,曾删改查

    Struts1.x 和 Hibernate 是两种在Java Web开发中广泛使用的开源框架,它们分别负责不同的职责。Struts1.x 是一个MVC(Model-View-Controller)框架,主要用于处理Web应用程序的业务逻辑和用户交互,而Hibernate则是...

    struts2+spring+hibernate+ajax纳税服务.rar

    总结来说,"struts2+spring+hibernate+ajax纳税服务"项目涵盖了Web开发中的核心技术和实践,对于想要提升Java Web开发技能的程序员来说,是一个宝贵的学习资料。通过这个项目,开发者可以掌握如何构建一个功能完善的...

    hibernate-release-4.2.8.Final.zip

    Hibernate 4.2.8.Final 是 Hibernate 开发团队在 4.x 系列中的一次稳定版本发布,它带来了诸多性能优化和功能增强。这个版本不仅修复了前一版本的已知问题,还引入了一些新的特性和API,使得开发者在处理复杂的持久...

    hibernate-5.2.12.Final最新官方完整版(含源码实例等)

    1. 支持JPA 2.2规范:在5.2.x版本中,Hibernate对Java Persistence API(JPA)2.2进行了全面支持,包括新的注解和查询特性。 2. 性能优化:对查询缓存和二级缓存进行了改进,提升了数据访问速度。 3. 新的Type系统:...

    hibernate-release-4.2.21.Final.zip

    总结,Hibernate 4.2.21.Final版本是一个集稳定性、兼容性与易用性于一体的ORM解决方案。通过深入学习和实践,开发者不仅可以提升数据库操作的效率,还能更好地理解和应用面向对象的设计原则。无论你是Hibernate的...

    hibernate-distribution-3.6.10.Final-dist.zip

    总结,"hibernate-distribution-3.6.10.Final-dist.zip"是Hibernate 3.x系列的一个稳定版本,它为Java开发者提供了强大的ORM工具,简化了数据库操作,提升了开发效率。在使用过程中,理解并熟练运用其核心概念和功能...

    HibernateSynchronizer(2.3.1 & 3.1.9)

    3. **更广泛的支持**:不仅支持Hibernate 3.x,还扩展到4.x和5.x版本,适应了Hibernate框架的演进。 4. **增强的错误处理**:3.1.9版的错误提示更加明确,帮助开发者快速定位问题,提高了开发效率。 四、Jeecms...

    struts1.x+spring+hibernate集成例子(包含所有jar包,ehcache二级缓存)

    总结来说,这个集成示例提供了一个完整的Java Web开发环境,展示了如何利用Struts1.x进行控制层操作,Spring进行业务层管理,Hibernate进行数据持久化,以及Ehcache进行性能优化。通过学习和实践这个例子,开发者...

    hibernate-3.6.5.Final-dist.zip

    本压缩包`hibernate-3.6.5.Final-dist.zip`包含了Hibernate 3.6.5最终稳定版的所有组件和文档,是开发人员学习和使用Hibernate 3.x系列的重要资源。 ### Hibernate ORM框架概述 Hibernate ORM框架的核心功能在于将...

    spring-framework-3.2.x.zip

    总结,Spring Framework 3.2.x是一个功能强大、高度可扩展的框架,它的设计思想和实践模式对Java开发者来说具有极高的学习价值。理解并熟练运用其中的知识点,不仅能提升开发效率,还能更好地实现代码的可维护性和可...

    hibernate-release-4.2.20.Final.zip

    Hibernate 4.2.20.Final是这个系列中的一个重要里程碑,它在4.x版本的基础上进行了多方面的优化。 二、核心概念 1. 实体(Entity):在Hibernate中,实体对应数据库表,是一个Java类,通过注解或XML配置与数据库表...

    hibernate_annotations.pdf

    在Hibernate 3.x版本后,注解方式逐渐成为其主要配置方法之一,它简化了开发流程,提高了开发效率。 #### 二、Hibernate注解基础 - **@Entity**:标记一个类为实体类,表示该类与数据库表相对应。 - **@Table**:...

    spring-framework-5.0.x.zip

    总结,Spring Framework 5.0.x是一个功能强大、扩展性强的框架,其源码的学习能帮助开发者更好地理解其工作原理,提升开发效率。无论是新手还是资深开发者,都应该深入学习并掌握这个重要的工具。

    hibernate 开发文档发布

    《Hibernate 开发文档详解》 ...通过阅读和实践,开发者不仅可以学习到如何使用Hibernate进行数据库操作,还能了解到ORM框架的设计思想和最佳实践,从而在实际项目中更好地利用Hibernate提升开发效率和应用质量。

    Hibernate.in.Action-en

    本书不仅涵盖了Hibernate的基本概念和核心功能,还提供了大量的实践案例和最佳实践,帮助开发者高效地实现数据库访问逻辑。 #### 三、第一章:理解对象/关系持久化 - **1.1 什么是持久化?** - **关系型数据库**: ...

    struts1.x 常用知识详解

    总结,Struts1.x作为经典的Web开发框架,其丰富的功能和广泛的应用使得学习和掌握它成为提升Java Web开发技能的重要一步。通过本教程,你将对Struts1.x有深入的理解,并能将其应用于实际项目中,构建出高效、稳定的...

Global site tag (gtag.js) - Google Analytics