Hibernate3.x:最出色的ORM框架

一、前言

JDBC是Java操作数据库最常用的数据库接口,它隔离了数据库的复杂度,使程序员可以将主要精力放到程序逻辑上来。而JDBC也只是提供了和数据库交互的简单方式,如打开数据库表,执行SQL语句等。这对于复杂的程序也需要编写大量的代码,因此,近几年在Java数据库领域出现了许多框架,这此框架重新对JDBC进行了更高层次的封装。如早期的iBATIS。这个框架使用起来非常方便。它也没有基于复杂的面向对象模型。也不工作在复杂的关系图中。这种最初级的框架将数据库和应用程序隔离开来。使程序员只操作逻辑数据库。但由于这种框架不是基本面向对象和关系模型,在对付大规模应用程序时仍然捉襟见肘。基于这些不足,最近许多基于关系映射(ORM)的数据库框架开始流行起来。Hibernate就是其中的佼佼者。ORM的基本思想是使用外键和适当的约束将抽象不同的数据库。在最新的Hibernate3.x中,增强了对约束的控制,使用功能更强,也更容易使用。

在这些ORM框架刚兴起的时候,有很多人认为ORM框架最多只是从多选择之一。即使某个ORM框架做的非常出钯,将对象和数据库之间映射的非常完美也是如此。他们认为直接使用SQL写程序才是王道,而使用自动生成的SQL的效率低下,而且很不灵活。但随着程序规模越来越大,这种想法越来越站不住脚。这主要并不只是因为直接使用SQL将产生大量的代码,而是因为使用ORM框架,我们将操作一个完全不同的层:ORM层。直接使用SQL也可能产生其他的问题,如我们经常会遇到的N+1选择问题。而且在连接很多表时,我们会一遍一遍地重复写非常类似的SQL语句。如果我们使用Hibernate,这些问量就将荡然无存。我们可以使非常简单的HQL来完成上述复杂的问题。象Hibernate一样ORM框架还应该能进行各种优化,以使操作达到最佳化。就目前来看,这些框架的优化功能已经越来越强,正在逐步取代用JDBC和SQL操作数据库的方式。

虽然可以用ORM框架来编写大多数程序,但有时也需要直接使用SQL来操作。也许Hibernate的开发团队也意识到了这一点,也为Hibernate提供了直接执行SQL的功能。在早期的Hibernate版本中,解决方案是直接将JDBC连接暴露给用户,这样程序员就可以直接使用prepared statment来执行SQL了。但在新的Hibernate3.x中,这种情况已经被改变了。现在,Hibernate3.x可以不使用一条SQL编写整个应用程序,而且这并不会影响Hibernate的灵活性,同时也可以使用Hibernate的所有其他特性。

二、Hibernate3.x功能演示

上面说了很多Hibernate的好处,也面就让我们来体会一下Hibernate3.x在这方面的卓越表现。我们将使用一个简单的Person-Employment-Oranization模型来说明。最简单的类是Person,下面是它的定义:

<class name="Person" lazy="true">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="name" not-null="true"/>
<loader query-ref="person"/>
<sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
<sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>

看了上面的定义,可能我们会首先注意到三个手写的SQL语句:INSERT、UPDATE和DELETE。其中的?将匹配上面所列的两个属性(这两个属性是id和name)。除了这个,这三条语句没有什么之处。

也许很多读者最感兴趣的是<loader>标签。这个标签定义了一个命名查询。这个查询在任何时候当我们使用get(),load()装载person或使用惰性关联获取数据时都会执行它。一般来讲,这个命名查询应该是一个SQL语句,如下面如示:

<sql-query name="person">
<return alias="p" class="Person" lock-mode="upgrade"/>
SELECT NAME AS {p.name}, ID AS {p.id} FROM PERSON WHERE ID=? FOR UPDATE
</sql-query>

注:一个本地的SQL查询可能会返回多个"实体列",但本例比较简单,只返回了一个实体。

Employment相对更复杂一点,而且并不是所有的属性都包括在INSERT和UPDATE中。定义如下:

<class name="Employment" lazy="true">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<many-to-one name="employee" not-null="true" update="false"/>
<many-to-one name="employer" not-null="true" update="false"/>
<property name="startDate" not-null="true" update="false"
insert="false"/>
<property name="endDate" insert="false"/>
<property name="regionCode" update="false"/>
<loader query-ref="employment"/>
<sql-insert>
INSERT INTO EMPLOYMENT
(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, ID)
VALUES (?, ?, CURRENT_DATE, UPPER(?), ?)
</sql-insert>
<sql-update>UPDATE EMPLOYMENT SET ENDDATE=? WHERE ID=?</sql-update>
<sql-delete>DELETE FROM EMPLOYMENT WHERE ID=?</sql-delete>
</class>

时间: 2024-12-03 22:10:05

Hibernate3.x:最出色的ORM框架的相关文章

Spring事务管理--多个ORM框架在使用时的情况分析

   公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,

Python中编写ORM框架的入门指引

  这篇文章主要介绍了Python中编写ORM框架的入门指引,示例代码基于Python2.x版本,需要的朋友可以参考下 有了db模块,操作数据库直接写SQL就很方便.但是,我们还缺少ORM.如果有了ORM,就可以用类似这样的语句获取User对象: ? 1 user = User.get('123') 而不是写SQL然后再转换成User对象: ? 1 2 u = db.select_one('select * from users where id=?', '123') user = User(*

java-有谁用过 ActiveJDBC 这个orm框架吗

问题描述 有谁用过 ActiveJDBC 这个orm框架吗 想找一个简单的orm框架,写点小东西,hb 和ib 感觉有点大,不值当,于是选了 感觉挺好的,可是我将 官方的例子导入运行 却报错了,不知道什么愿意,求大神!坐等... Exception in thread ""main"" org.javalite.activejdbc.DBException: failed to determine Model class name are you sure mode

你认为dlinq的出现,会不会把市面上的一些orm框架都灭掉?

问题描述 你认为dlinq的出现,会不会把市面上的一些orm框架都灭掉? 解决方案 解决方案二:你认为Windows的出现,会不会把市面上的一些OS都灭掉?你要明白一件事...没有任何产品能满足所有应用需求...解决方案三:满足不满足是一回事,能不能生存是另一回事.解决方案四:dlinq是什么东西解决方案五:不会吧,他们两个冲突么解决方案六:3.0出来会不会把2.0灭掉?解决方案七:灭了

改一个用orm框架搭成的系统出现下面的错误

问题描述 改一个用orm框架搭成的系统出现下面的错误 我的打算是将原有系统里面的登录表换成自己创的一张表,但是出现这个错误,求高手解答 解决方案 http://blog.csdn.net/mynewdays/article/details/7822412

OEA ORM 框架中的冗余属性设计

OEA 框架提供了多种方式来优化分布式数据查询的性能,本篇将会说明如何以声明 OEA 冗余属性的方式,来实现轻量级的数据冗余,以减少关联查询次数及网络数据传输量,提高分布式应用程序性能.   冗余属性功能说明 OEA 冗余属性在框架层面提供了一种易用的机制,把指定冗余路径的关系对象中的属性值复制到本对象中,以解决关联查询.关联数据量等性能问题.应用开发人员只需要简单的定义一个冗余属性,而框架会自动完成对冗余属性的赋值.更新操作.   ORM 中的 N+1 问题示例 在进销存示例中,采购订单的列表

小巧优美的ORM框架-doodads入门指南

关于.net下的ORM框架,大家最为耳熟的可能就是NHibernate了,当然,很多公司正在使用自己开发的ORM框架,笔者至少见过3家不同公司的ORM框架,其实都是大同小异,借助于codesmith.mygeneration等代码生成工具,自己开发一个ORM框架也不是什么难事,关键的问题是,你能不能设计出代码优美简洁.功能灵活.定制方便以及部署容易的ORM框架. 我去年开始热衷NHibernate(与其说热衷,不如说是迷信,因为后来越来越多的证据证明,公司自己的那套用了几年的使用Excel生成实

基于Knex.js的Node.js ORM框架 bookshelf

bookshelf 详细介绍 一个基于Knex.js的Node.js ORM框架,支持PostgreSQL,MySQL和SQLite3 简单来说,Bookself是一个优秀的代码库,它易于阅读.理解.可扩展.它不强制你使用任何特定的校验scheme,而是提供灵活有效的关系或嵌套关系加载策略,一级类支持事务.它是一个精益的对象关系映射器(lean Object Relation Mapper),允许你使用原始的knex接口,当你需要自定义查询时,因为它有时并不能完全满足老一套的惯例. Booksh

ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

原文:ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库 前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET--"Jws.Mono".由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间来研究这个,小蝶惊鸿的博客又激起了我的兴趣,我花了四天的时间,终于在Liunx上跑起了属于我自己的应用程序,其中数据库使用到了PostgreSQL数据库.对于数据库的选用