Hibernate实践
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
设计细颗粒度的持久类并且使用<component>来实现映射。
使用一个Address持久类来封装 street, suburb, state, postcode. 这将有利于代码重用和简化代码重构(refactoring)的工作。
对持久类声明标识符属性。
Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义)。虽然原生类型从语法上可能更易于使用,但使用long或java.lang.Long没有任何区别,。
为每个持久类写一个映射文件
不要把所有的持久类映射都写到一个大文件中。把 com.eg.Foo 映射到com/eg/Foo.hbm.xml中, 在团队开发环境中,这一点显得特别有意义。
把映射文件作为资源加载
把映射文件和他们的映射类放在一起进行部署。
考虑把查询字符串放在程序外面
如果你的查询中调用了非ANSI标准的SQL函数,那么这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。
使用绑定变量
就像在JDBC编程中一样,应该总是用占位符"?"来替换非常量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。
不要自己来管理JDBC connections
Hibernate允许应用程序自己来管理JDBC connections,但是应该作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑实现自己来实现org.hibernate.connection.ConnectionProvider
考虑使用用户自定义类型(custom type)
假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现net.sf.hibernate.UserType接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。
在性能瓶颈的地方使用硬编码的JDBC
在对性能要求很严格的一些系统中,一些操作(例如批量更新和批量删除)也许直接使用JDBC会更好,但是请先搞清楚这是否是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session 然后从 Session获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。
理解Session清洗( flushing)
Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,性能会受到一定的影响。有时候你可以通过禁止自动flushing,尽量最 小化非必要的flushing操作,或者更进一步,在一个特定的transaction中改变查询和其它操作的顺序。
在三层结构中,考虑使用 saveOrUpdate()
当使用一个servlet / session bean 类型的架构的时候, 你可以把已加载的持久对象在session bean层和servlet / JSP 层之间来回传递。使用新的session来为每个请求服务,使用 Session.update() 或者Session.saveOrUpdate()来更新对象的持久状态。
在两层结构中,考虑断开session.
为了得到最佳的可伸缩性,数据库事务(Database Transaction)应该尽可能的短。但是,程序常常需要实现长时间运行的“应用程序事务(Application Transaction)”,包含一个从用户的观点来看的原子操作。这个应用程序事务可能跨越多次从用户请求到得到反馈的循环。请使用脱管对象(与 session脱离的对象),或者在两层结构中,把Hibernate Session从JDBC连接中脱离开,下次需要用的时候再连接上。绝不要把一个Session用在多个应用程序事务(Application Transaction)中,否则你的数据可能会过期失效。
不要把异常看成可恢复的
这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时候,必须要回滚 Transaction ,关闭Session。如果你不这样做的话,Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用Session.load()来判断一个给定标识符的对象实例在数据库中是否存在,应该使用find()。
对于关联优先考虑lazy fetching
谨慎的使用主动外连接抓取(eager (outer-join) fetching)。对于大多数没有JVM级别缓存的持久对象的关联,应该使用代理(proxies)或者具有延迟加载属性的集合(lazy collections)。对于被缓存的对象的关联,尤其是缓存的命中率非常高的情况下,应该使用outer-join="false",显式的禁止掉eager fetching。如果那些特殊的确实适合使用outer-join fetch 的场合,请在查询中使用left join。
考虑把Hibernate代码从业务逻辑代码中抽象出来
把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAO和Thread Local Session模式。通过Hibernate的UserType,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)
使用与业务有关的键值来实现equals()和 hashCode() .
如果你在Session外比较对象,你必须要实现equals()和 hashCode()。 在Session内部,Java的对象识别机制是可以保证的。如果你实现了这些方法,不要再使用数据库(主键)辨识!瞬时对象不具有(数据库)标识值,Hibernate会在对象被保存的时候赋予它一个值。如果对象在被保存的时候位于Set内,hash code就会变化,要约就被违背。为了实现用与业务有关的键值编写equals()和 hashCode(),你应该使用类属性的唯一组合。记住,这个键值只是当对象位于Set内部时才需要保证稳定且唯一,并不是在其整个生命周期中都需要(不需要达到数据库主键这样的稳定性)。绝不要在equals()中比较集合(要考虑延迟装载),并且小心对待其他可能被代理过的类。
不要用怪异的连接映射
多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我 们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。
- 大小: 39.1 KB
分享到:
相关推荐
**hibernate实践** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。这篇文档集合了丰富的Hibernate实践知识,对于初学者来说是一份...
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...
### Hibernate实践概述与知识点 #### 一、单表操作概览与关键技术点 **环境准备:** 进行Hibernate实践,首先需要一系列的环境搭建,包括数据库(本例为Oracle9i)、数据库驱动(ojdbc14.jar)、Hibernate核心库...
在这个“hibernate 实践 - Query详解”的主题中,我们将深入理解如何使用Query接口来执行SQL查询,并绑定参数。 1. **Query接口** Query接口是Hibernate提供的一种用于执行HQL(Hibernate查询语言)或SQL查询的API...
### Hibernate实践:数据库操作 #### 一、引言 Hibernate是一个强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。在实际应用Hibernate进行开发的过程中,虽然能够享受到它带来的诸多...
**标题:手写Hibernate实践详解** 在Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库与Java对象之间的交互。"第一个手写Hibernate"项目旨在帮助开发者深入理解Hibernate...
`第二章mysql.sql` 文件可能是用于配合 Hibernate 实践的 MySQL 数据库脚本,包含了创建对应表的 SQL 语句。而 `H02` 文件名可能表示课程的第二个部分,其中可能包含更多的实践示例或扩展概念。 学习 Hibernate 的...
4. **映射文件(hbm.xml)**:虽然在现代Hibernate实践中,通常更倾向于使用注解来定义映射,但传统的XML映射文件仍然有价值。映射文件定义了实体类和数据库表之间的详细关系,包括列映射、关联关系等。 5. **...
在现代的Hibernate实践中,更倾向于使用注解(Annotations)来替代XML映射。 然后,我们需要一个SessionFactory,它是Hibernate的主要工作单元,负责创建Session。SessionFactory通过读取配置文件和映射信息被初始...
### Hibernate实践:深入理解与应用 #### 一、Hibernate简介及重要性 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java环境下的数据库交互。它简化了数据持久化层的开发工作,允许开发者以面向对象的方式...
开始Hibernate实践的第一步是搭建项目环境,这包括添加必要的库依赖、配置Hibernate的hibern.cfg.xml文件以及实体类的映射文件(如.hbm.xml)。同时,需要创建数据库并建立相应的表结构。 3. **实体类与数据表映射...
不过,在现代的Hibernate实践中,更常见的是使用注解方式来替代XML映射,使得映射信息直接嵌入到实体类中,便于维护和理解。 生成这些文件的过程如下: 1. 安装并配置Hibernate Tools或类似工具。 2. 连接数据库,...
《Hibernate从实践到精通》是一本深度探讨Java持久化框架Hibernate的专业教程,旨在帮助开发者从基础知识到高级技术全面掌握Hibernate的使用。通过实例演示,它深入浅出地讲解了Hibernate的核心概念和技术,使得读者...
总的来说,这个“hibernate小试”资源提供了一个基础的Hibernate实践教程,涵盖了数据库连接配置、实体类定义、映射文件创建、以及基本的CRUD操作。对于初学者来说,这是一个很好的起点,帮助理解Hibernate的工作...
《深入解析osworkflow2.8整合Spring与Hibernate实践》 osWorkflow是一款开源的工作流引擎,它主要用于处理业务流程中的各种任务调度和流转。在本文中,我们将深入探讨如何将osWorkflow2.8版本与Spring和Hibernate...
本压缩包中的学习资料包括了“Hibernate reference”和“Hibernate实践”等内容,旨在帮助你深入理解和熟练运用Hibernate。 一、Hibernate核心概念 1. 对象关系映射(ORM):Hibernate是ORM框架的代表,它通过映射...
**在线论坛BBS的Hibernate实践** 1. **数据库设计**:首先,我们需要设计论坛的数据库结构,包括用户表(User)、帖子表(Post)、评论表(Comment)等。每个表的字段应该对应实体类的属性。 2. **实体类创建**:...
【Hibernate实践探索】 在深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架之前,我们需要先理解ORM的基本概念。ORM是将数据库中的表映射为Java对象,使得开发者可以使用面向对象的方式来操作数据库,简化...