`
wnzz95391511
  • 浏览: 126810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate实践

阅读更多
感觉这篇写Hibernate的文章写的相当好,转载其中的部分内容,与大家分享!

作者:BlueDavy
来源:www.blogjava.net/BlueDavy

原文:http://www.blogjava.net/BlueDavy/archive/2006/03/27/37582.html

3.2.1.        新增 / 编辑 / 删除
新增 / 编辑 / 删除是持久操作中最常使用的维护性操作,基于 Hibernate 做这样的维护就比采用 sql 的方式简单多了,通过上面 CommonDao ,就可以直接完成 dao.save 、 dao.update 、 dao.delete 的操作,而且在 Hibernate 3 也支持了批量的 insert 、 update 和 delete 。
这个部分中需要注意的是 Hibernate 对于对象的三种状态的定义:

  • Transient

很容易理解,就是从未与 session 发生过关系的对象, ^_^ ,例如在代码中直接 User user=new User() ;这样形成的 user 对象,就称为 Transient 对象了。

  • Detached

同样很容易理解,就是与 session 发生过关系的对象,但 session 已经关闭了的情况下存在的对象,例如:
User user=new User();
user.setName(“bluedavy”);
session.save(user);
session.close();
在 session.close() 后这个时候的 user 对象就处于 Detached 状态之中了,如果想将这个对象变为 Persistent 状态,可以通过 session.merge 或 session.saveOrUpdate() 等方式来实现。
Detached 状态的对象在实际的应用中最常采用,从概念上我们可以这么理解,处于 Detached 状态的对象可以看做是一个 DTO ,而不是 PO ,这从很大程度上就方便了 PO 在实际项目中的使用了。

  • Persistent

Persistent 状态就是指和 Session 发生了关系的对象,并且此时 session 未关闭,举例如下:
User user=new User();
user.setName(“bluedavy”);
session.save(user);
user.getName();
在 session.save 后 user 就处于 Persistent 状态,此时如果通过 session 根据 user 的 id 去获取 user 对象,则可发现获取的对象和之前的 user 是同一个对象,这是 session 一级缓存所起的作用了,当然,也可以强制的刷新 session 的一级缓存,让 session 从数据库中重新获取,只需要在获取前执行 session.evict(user) 或 session.clear() 。

3.2.2.        关联维护
关联维护在 Hibernate 中表现出来可能会让熟悉使用 sql 的人有些的不熟,但其实以对象的观点去看是会觉得很正常的。
在 Hibernate 的关联维护中,最重要的是 inverse 和 cascade 两个概念。

  • inverse

inverse 从词义上看过去可能不是那么容易理解,其实它的意思就是由谁来控制关联关系的自动维护,当 inverse=true 就意味着当前对象是不能自动维护关联关系,当 inverse=false 就意味着当前对象可自动维护关联关系,还是举例来说:
假设 Org 和 User 一对多关联,
当 org 中 getUsers 的 inverse=false 的情况:
org.getUsers().add(user);
dao.save(org);
这样执行后将会看到数据库中 user 这条记录中的 orgId 已经被设置上去了。
当 inverse=true 的情况下,执行上面的代码,会发现在数据库中 user 这条记录中的 orgId 没有被设置上去。
^_^ , inverse 的作用这样可能看的不是很明显,在下面的一对多中会加以描述。

  • cascade

cascade 的概念和数据库的 cascade 概念是基本一致的, cascade 的意思形象的来说就是当当前对象执行某操作的情况下,其关联的对象也执行 cascade 设置的同样的操作。
例如当 org.getUsers 的 cascade 设置为 delete 时,当删除 org 时,相应的 users 也同样被删除了,但这个时候要注意, org.getUsers 这个集合是被删除的 user 的集合,也就是说如果这个时候数据库中新增加了一个 user 给 org ,那么这个 user 是不会被删除的。
cascade 的属性值详细见《 Hibernate reference 》。

五.              性能[/b]

Hibernate 作为ORM工具,从性能上来讲带给了很多人忧虑,但我觉得Hibernate在性能上也许会带来少许的降低,但如果对于不能合理设计数据库和使用SQL的人来说,我觉得Hibernate反倒能提高性能,除非是在一些特殊的场合,如报表式的那种查询推荐继续采用JDBC的方式。

Hibernate 在性能提升上其实有很多种做法,在《Hibernate Reference》中也有专门的提升性能的章节,在这里我提几点在项目中通常采用的方法。

[b]5.1. Lazy Load


Lazy Load 是常用的一种提升性能的方法,这个其实很容易理解,在不采用lazy load的情况下,Hibernate在获取一个PO的时候,将同时获取PO中的属性、PO中的集合以及集合中对象的属性、集合,这样看过去很容易看出,如果对象的关联结构有深层次的话,最后搞不好整个库都被加载出来了,而在实际使用中往往可能只需要用到PO中的一两个属性而已,这点也是之前的ORM产品经常被批的一点,就是ORM产品不能象sql那样只获取需要的东西,^_^,其实Hibernate在这点上一直就支持,而且支持的还不错,在Hibernate 3以后,默认的lazy就已经设置为true了,这个时候包括po中的属性都是采用lazy load的方式,只有在调用到这个属性时才会从缓存或数据库中加载,当然,集合也同样如此。

在lazy load上推荐不要什么字段都采用lazy load的方式,对于一些基本属性的字段建议将其lazy设置为false,而对于一些可能需要消耗内存的字段,如clob这样的字段对象的lazy设置为true,对于集合则全部设置为lazy=true。

是否采用Lazy load对系统的性能会有非常明显的影响,同时尽量不要将Detached Object放入Http的session中。

5.1.1.        OSIV

OSIV : Open Session In View ,在 B/S 系统中通常采用这种方式来更好的去支持 Lazy load ,意思就是在 View 加载前打开 Session ,在 View 加载完毕后关闭 Session 的方式,在 Spring 中有 OpenSessionInViewFilter ,可参考或直接使用。

5.2. Cache

Cache 是在提升系统性能方面常用的方法,在Hibernate中通常有非常好的对于Cache的支持方法,Hibernate中对于Cache有一级缓存和二级缓存的概念,一级缓存是必须的,位于Session部分,二级缓存则不是必须的,由开发人员自行指定,二级缓存可指定使用何种开源的cache工具,Hibernate 3以后的版本默认使用的是Ehcache,也可以切换为Oscache、JbossCache,对我而言最重要的区别在于对于cluster的支持上。

二级缓存能够明显的提高系统的性能,当然,同时也会更加的消耗内存,可以通过配置文件来指定内存中能够加载的最多的元素,这有利于避免消耗过多内存。

二级缓存的设置在Hibernate中非常的简单,只需要在相应的hbm.xml中增加cache元素,指明使用何种策略,如read-only、read-write等,也可以直接在hibernate.cfg.xml中增加class-cache的方式来进行全局指定。

5.3. 高效的查询语句


查询语句的是否高效对于系统的性能也是会造成明显的影响的,为了方便系统性能的调优,建议大家对查询语句进行统一管理,如统一采用NamedQuery的方式,在这样的情况下可以在系统运行时请教数据库专家,由他们来分析系统中的查询语句的执行效率以及提出改进策略,而对于开发人员来讲,在查询语句方面最能够注意的就是采用占位符式的查询。

5.3.1.        占位符式的查询

数据库对于所有的 sql 语句都要进行语法分析,而其分析通常会受到语句中的大小写、空格以及参数不同的影响,在其语法分析器认为不同的情况下将再次进行分析,这就不可避免的降低了响应的速度,而采用占位符式的查询则可保证语法分析器只进行一次的分析,在参数不同的情况并不会出现重复解析的现象,其次就是要统一查询语句的编写风格,包括大小写、空格这些。

我不是很确定 Hibernate 中对于语句的语法分析,估计和数据库的这种方式应该差不多,不过猜想可能会更智能一些, ^_^



PS:HQL查询的时候一定是针对对象的查询,属性和对象名一定都是符合POJO类中对象实体的名称。
如:Person类含有对象personName属性
   对应的数据库中的表名为PERSON,字段PERSON_NAME。
那么在使用HQL查询的时候应当这样使用
FROM Person WHERE personName = ? 
分享到:
评论

相关推荐

    hibernate实践

    **hibernate实践** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。这篇文档集合了丰富的Hibernate实践知识,对于初学者来说是一份...

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...

    Hibernate实践.pdf

    ### Hibernate实践概述与知识点 #### 一、单表操作概览与关键技术点 **环境准备:** 进行Hibernate实践,首先需要一系列的环境搭建,包括数据库(本例为Oracle9i)、数据库驱动(ojdbc14.jar)、Hibernate核心库...

    hibernate 实践 Query详解

    在这个“hibernate 实践 - Query详解”的主题中,我们将深入理解如何使用Query接口来执行SQL查询,并绑定参数。 1. **Query接口** Query接口是Hibernate提供的一种用于执行HQL(Hibernate查询语言)或SQL查询的API...

    Hibernate实践 DB操作

    ### Hibernate实践:数据库操作 #### 一、引言 Hibernate是一个强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。在实际应用Hibernate进行开发的过程中,虽然能够享受到它带来的诸多...

    第一个手写Hibernate

    **标题:手写Hibernate实践详解** 在Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库与Java对象之间的交互。"第一个手写Hibernate"项目旨在帮助开发者深入理解Hibernate...

    hibernate映射和查询

    `第二章mysql.sql` 文件可能是用于配合 Hibernate 实践的 MySQL 数据库脚本,包含了创建对应表的 SQL 语句。而 `H02` 文件名可能表示课程的第二个部分,其中可能包含更多的实践示例或扩展概念。 学习 Hibernate 的...

    Hibernate element使用

    4. **映射文件(hbm.xml)**:虽然在现代Hibernate实践中,通常更倾向于使用注解来定义映射,但传统的XML映射文件仍然有价值。映射文件定义了实体类和数据库表之间的详细关系,包括列映射、关联关系等。 5. **...

    hibernate hellowrold入门级代码

    在现代的Hibernate实践中,更倾向于使用注解(Annotations)来替代XML映射。 然后,我们需要一个SessionFactory,它是Hibernate的主要工作单元,负责创建Session。SessionFactory通过读取配置文件和映射信息被初始...

    hibernate

    ### Hibernate实践:深入理解与应用 #### 一、Hibernate简介及重要性 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java环境下的数据库交互。它简化了数据持久化层的开发工作,允许开发者以面向对象的方式...

    hibernate 自己做的实例

    开始Hibernate实践的第一步是搭建项目环境,这包括添加必要的库依赖、配置Hibernate的hibern.cfg.xml文件以及实体类的映射文件(如.hbm.xml)。同时,需要创建数据库并建立相应的表结构。 3. **实体类与数据表映射...

    根据数据库表生成实体、hibernate配置文件和实体映射文件

    不过,在现代的Hibernate实践中,更常见的是使用注解方式来替代XML映射,使得映射信息直接嵌入到实体类中,便于维护和理解。 生成这些文件的过程如下: 1. 安装并配置Hibernate Tools或类似工具。 2. 连接数据库,...

    Hibernate从实践到精通

    《Hibernate从实践到精通》是一本深度探讨Java持久化框架Hibernate的专业教程,旨在帮助开发者从基础知识到高级技术全面掌握Hibernate的使用。通过实例演示,它深入浅出地讲解了Hibernate的核心概念和技术,使得读者...

    hibernate小试

    总的来说,这个“hibernate小试”资源提供了一个基础的Hibernate实践教程,涵盖了数据库连接配置、实体类定义、映射文件创建、以及基本的CRUD操作。对于初学者来说,这是一个很好的起点,帮助理解Hibernate的工作...

    osworkflow2.8基于Spring+Hibernate

    《深入解析osworkflow2.8整合Spring与Hibernate实践》 osWorkflow是一款开源的工作流引擎,它主要用于处理业务流程中的各种任务调度和流转。在本文中,我们将深入探讨如何将osWorkflow2.8版本与Spring和Hibernate...

    Hibernate学习资料

    本压缩包中的学习资料包括了“Hibernate reference”和“Hibernate实践”等内容,旨在帮助你深入理解和熟练运用Hibernate。 一、Hibernate核心概念 1. 对象关系映射(ORM):Hibernate是ORM框架的代表,它通过映射...

    在线论坛BBS(Hibernate技术)

    **在线论坛BBS的Hibernate实践** 1. **数据库设计**:首先,我们需要设计论坛的数据库结构,包括用户表(User)、帖子表(Post)、评论表(Comment)等。每个表的字段应该对应实体类的属性。 2. **实体类创建**:...

    Hibernate练习笔记

    【Hibernate实践探索】 在深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架之前,我们需要先理解ORM的基本概念。ORM是将数据库中的表映射为Java对象,使得开发者可以使用面向对象的方式来操作数据库,简化...

Global site tag (gtag.js) - Google Analytics