`
nauu
  • 浏览: 24638 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

<转>HIbernate小记

阅读更多

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

分享到:
评论

相关推荐

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map&lt;String, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map&lt;String, Object&gt;...

    Hibernate Spatial 4 教程

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-spatial&lt;/artifactId&gt; &lt;version&gt;4.0&lt;/version&gt; &lt;/dependency&gt; ... &lt;/dependencies&gt; 三、 配置 Spatial Dialect 要使用地理数据支持,需要在 ...

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;${hibernate.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate.javax.persistence&lt;/groupId&gt; ...

    hibernate 教程

    开始Hibernate之旅&lt;br&gt;1.2. 第一个可持久化类&lt;br&gt;1.3. 映射cat&lt;br&gt;1.4. 与猫同乐&lt;br&gt;1.5. 结语&lt;br&gt;2. 体系结构&lt;br&gt;2.1. 总览&lt;br&gt;2.2. JMX集成&lt;br&gt;2.3. JCA支持&lt;br&gt;3. SessionFactory配置&lt;br&gt;3.1. 可编程配置方式&lt;br...

    hibernate学习

    &lt;br&gt;&lt;br&gt;搜集清单和说明&lt;br&gt;1:hibernate学习源码,这是我以前做练习的代码,希望对感兴趣的朋友&lt;br&gt;有些帮助。&lt;br&gt;2:hibernate_reference.pdf,我以前学习参看的资料。&lt;br&gt;3:hibernate源码.zip,hibernate的源...

    Spring4 + Hibernate5详细maven构建.docx

    - **Hibernate版本**: `&lt;hibernate.version&gt;5.0.8.Final&lt;/hibernate.version&gt;` 指定了Hibernate ORM的具体版本号。 **1.2 Spring核心依赖** ```xml &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; ...

    struts_hibernate框架权限管理系统

    &lt;br&gt;&lt;br&gt;mysql初始数据库用户名:root,密码:1234&lt;br&gt;&lt;br&gt;其它数据库请相应修改hibernate.cfg.xml这映射文件为与你数据库相匹配&lt;br&gt;&lt;br&gt;注释:&lt;br&gt;1,默认配置为mysql5.0&lt;br&gt;hibernate.cfg.xml.mssql为Ms sqlserver2000...

    spring+struts+hibernate+dwr+jstl做的实例

    2.7.6rc1.jar&lt;br&gt;asm.jar&lt;br&gt;asm-attrs.jar&lt;br&gt;cglib-2.1.3.jar&lt;br&gt;commons-collections-2.1.1.jar&lt;br&gt;commons-logging-1.0.4.jar&lt;br&gt;dom4j-1.6.1.jar&lt;br&gt;ehcache-1.1.jar&lt;br&gt;hibernate3.jar&lt;br&gt;jaas.jar&lt;br&gt;jaxen-...

    hibernate集成memcached所需jar

    &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt; &lt;version&gt;1.7.22&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;commons-codec&lt;/groupId&gt; &lt;artifactId&gt;commons-codec&lt;/artifactId&gt; ...

    ( maven中整合Spring+hibernate的pom.xml文件的配置.doc )

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;3.3.0.CR2&lt;/version&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt; ...

    hibernate-3.2

    此资源包括hibernate-3.2\lib\antlr-2.7.6.jar&lt;br&gt; hibernate-3.2\lib\asm.jar&lt;br&gt; hibernate-3.2\lib\cglib-2.1.3.jar&lt;br&gt; hibernate-3.2\lib\commons-collections-2.1.1.jar&lt;br&gt; hibernate-3.2\lib\commons-...

    hibernate-3.22

    hibernate-3.2\lib\antlr-2.7.6.jar&lt;br&gt; hibernate-3.2\lib\asm.jar&lt;br&gt; hibernate-3.2\lib\cglib-2.1.3.jar&lt;br&gt; hibernate-3.2\lib\commons-collections-2.1.1.jar&lt;br&gt; hibernate-3.2\lib\commons-logging-1.0.4....

    Hibernate v3.2中文参考手册

    &lt;br&gt;&lt;br&gt;阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 &lt;br&gt;&lt;br&gt;阅读第 2 章 体系结构(Architecture)来理解...

    mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试

    column="EVENT_ID"&gt;&lt;br&gt; &lt;generator class="native"/&gt;&lt;br&gt; &lt;/id&gt;&lt;br&gt; &lt;property name="date" type="timestamp" column="EVENT_DATE"/&gt;&lt;br&gt; &lt;property name="title"/&gt;&lt;br&gt; &lt;/class&gt;&lt;br&gt;&lt;br&gt;&lt;/hibernate-mapping&gt;&lt;br&gt;...

    Hibernate3.2官方中文参考手册

    &lt;br&gt;&lt;br&gt;阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 &lt;br&gt;&lt;br&gt;阅读第 2 章 体系结构(Architecture)来理解...

    spring-hibernate-dwr实例

    collections-2.1.1.jar&lt;br&gt;commons-logging-1.0.4.jar&lt;br&gt;dom4j-1.6.1.jar&lt;br&gt;ehcache-1.1.jar&lt;br&gt;hibernate3.jar&lt;br&gt;jaas.jar&lt;br&gt;jaxen-1.1-beta-7.jar&lt;br&gt;jdbc2_0-stdext.jar&lt;br&gt;jta.jar&lt;br&gt;log4j-1.2.11.jar&lt;br&gt;...

    创建hibernate的连接池及封装bean类的方式(图解)

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;5.4.26.Final&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate.common&lt;/groupId&gt; &lt;artifactId&gt;hibernate...

    Struts+Spring+Hibernate实现上传下载(MyEclipse版)

    在天极网看了一篇用JBuilder实现的“Struts+... &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;所用软件或包的版本: &lt;br&gt;Struts 1.2 &lt;br&gt;Spring 1.2.8 &lt;br&gt;Hibernate 3.1 &lt;br&gt;Oracle 9i &lt;br&gt;MyEclipse4.1.1 &lt;br&gt;&lt;br&gt;具体代码如下: &lt;br&gt;TFile类:

    struts+spring+hibernate实列

    Struts + Spring + Hibernate&lt;br&gt;=======================&lt;br&gt;目标:&lt;br&gt;制作一个简单的登录页面。&lt;br&gt;=======================&lt;br&gt;步骤:&lt;br&gt;1:配置hibernate,生成po和映射文件 ok&lt;br&gt;2:制作dao,测试 ok &lt;br&gt;3...

Global site tag (gtag.js) - Google Analytics