详细描述Hibernate3实践

开发 后端
这里介绍Hibernate3实践,Hibernate不是盏省油的灯,也不是想像的射来射去很简单的事,有很多细节处理不好会让你很不舒服的。

在向大家详细介绍Hibernate3实践之前,首先让大家了解下Session的save()、persist()、update()、saveOrUpdate()、merge()、delete()方法。

Hibernate3实践

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操作的对象是有状态的,分三类:
1)自由状态(transient): 未持久化,未与任何Session相关联,数据库表中没有对应的记录。
2)持久化状态(persistent): 与一个Session相关联,对应数据库表中一条记录。
3)游离状态(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()方法来统一保存和更新的方法。以上是Hibernate3实践

【编辑推荐】

  1. Hibernate类库简单描述
  2. 浅析Hibernate延迟加载
  3. Spring Hibernate简单讨论
  4. 介绍Hibernate版本的更新
  5. 简单讲述Hibernate实例
责任编辑:佚名 来源: 博客园
相关推荐

2009-09-24 16:19:53

Hibernate应用

2009-09-25 14:28:40

Hibernate S

2009-09-14 14:58:52

LINQ to XML

2009-09-14 13:14:49

LINQ序列

2009-09-14 16:33:55

LINQ To XML

2010-02-05 16:58:18

Android服务

2009-11-18 11:14:49

2009-06-17 09:17:41

Hibernate3

2009-08-10 16:40:03

C#索引器

2009-10-15 14:59:45

网络布线光纤技术

2010-04-09 17:45:06

Oracle索引

2009-09-08 11:09:39

LINQ数据源

2009-09-07 15:15:43

2009-08-26 15:53:48

C#扩展方法

2009-08-27 15:17:40

C# const变量

2009-10-10 10:04:50

RHEL合法使用

2009-09-24 10:22:38

Hibernate3新

2010-09-08 15:10:48

2011-11-02 09:29:42

存储虚拟化虚拟化

2009-09-03 17:59:18

C#调用事件
点赞
收藏

51CTO技术栈公众号