Hibernate与JDO肩并肩

原创 2004年05月11日 11:23:00

在theServerSide.com上有一些人声称JDO的开发人员已经把JDO带向错误的道路,并且指出Hibernate相对更优秀。然而,根据我的经验Hibernate和JDO都是O/R Mapping的优秀技术。

它们有许多共同的特征,包括:

  • 支持Plain Old Java Object (POJO) 的几近透明的持久层
  • 基於XML的object/relational映射
  • 两者都有一个"EntityManager" API - Hibernate Session 和 JDO PersistenceManager
  • 都可以在或不在Container中运行应用程序
  • 事务级和应用级的cache
  • 丰富的查询语言 (query language)
  • 能够积极和消极两种方式装载有关联的对象
  • 有效率地处理大数据集合

因此,JDO 和 Hibernate 两种版本的同一应用程序经常很相似。

关于如何装载对象和执行查询,我们来看看下面的例子。这里有两个版本的RestaurantRepository类,一个是JDO的,另一个是Hibernate的。 RestaurantRepository类定义了寻找饭店的方法:

  • findRestaurant() - 找单一饭店 (类似于 findByPrimaryKey()).
  • findAvailableRestaurants() - 执行查询,找到在特定时间特定区域营业的饭店

列表 1 显示了JDO版的 RestaurantRepository 类, 列表 2 显示了Hibernate 的版本。

列表 1 - JDO 版

public class JDORestaurantRepositoryImpl
    implements RestaurantRepositoryImpl {

  public Restaurant findRestaurant(String restaurantId) {
   PersistenceManager pm = PMRegistry.getPM();
   return (Restaurant) pm.getObjectById(
    pm.newObjectIdInstance(
     JDORestaurant.class,
     restaurantId),
    true);
  }


    private static final String QUERY_STRING =
        "serviceArea.contains(zipCode) && timeRanges.contains(tr) && "
            + "(tr.dayOfWeek == day && "
            + "(tr.openHour < hour || (tr.openHour == hour && tr.openMinute <= minute)) && "
            + "(tr.closeHour > hour || (tr.closeHour == hour && tr.closeMinute > minute)))";

    public Collection findRestaurants(
        Address deliveryAddress,
        Date deliveryTime) {
        Calendar c = Calendar.getInstance();
        c.setTime(deliveryTime);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        PersistenceManager pm = PMRegistry.getPM();
        Query query = pm.newQuery(JDORestaurant.class, QUERY_STRING);
        query.declareVariables("JDOTimeRange tr");
        query.declareParameters(
            "String zipCode, int day, int hour, int minute");
        Collection result =
            (Collection) query.executeWithArray(
                new Object[] {
                    deliveryAddress.getZip(),
                    new Integer(dayOfWeek),
                    new Integer(hour),
                    new Integer(minute)});
        return result;
    }
}

 

列表 2 - Hibernate 版

public class HibernateRestaurantRepositoryImpl
    implements RestaurantRepositoryImpl {

    public Restaurant findRestaurant(String restaurantId) {
        try {
            Session session = HibernateSessionRegistry.getSession();
            Restaurant restaurant =
                (Restaurant) session.load(
                    HibernateRestaurant.class,
                    new Long(restaurantId));
            return restaurant;
        } catch (HibernateException e) {
            throw new ApplicationRuntimeException(e);
        }
    }

    public Collection findRestaurants(
        Address deliveryAddress,
        Date deliveryTime) {
        try {
            Query query =
                makeFindRestaurantsQuery(
                    deliveryAddress,
                    deliveryTime);
            return query.list();
        } catch (HibernateException e) {
            throw new ApplicationRuntimeException(e);
        }
    }

    private Query makeFindRestaurantsQuery(
        Address deliveryAddress,
        Date deliveryTime)
        throws HibernateException {
        Calendar c = Calendar.getInstance();
        c.setTime(deliveryTime);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
        Session session = HibernateSessionRegistry.getSession();
        Query query =
            session.getNamedQuery("findAvailableRestaurants");
        query.setString("zipCode", deliveryAddress.getZip());
        query.setInteger("dayOfWeek", dayOfWeek);
        query.setInteger("hour", hour);
        query.setInteger("minute", minute);
        query.setCacheable(true);
        return query;
    }
}

每个 repository 由两个方法组成。这两个方法调用相应的 persistence framework API:

  • findRestaurant() - JDO 版调用 PersistenceManager.getObjectById() 而 Hibernate版调用 Session.load()
  • findAvailableRestaurants() - 两个版本都使用Query interface来执行有名参数的查询. 有个不同的地方,Hibernate 版用 named query, named query会在一个映射文件中定义,而 JDO 版用镶嵌在类里的 query 

两个类通过 ThreadLocal-based registry 得到 Hibernate Session 和 JDO PersistenceManager。如你所见,除了方法和类的名字不同,其它code都非常相似。

 

 

Jdbc、Jdo方面问题

87、Class.forName的作用?为什么要用? 答:调用该访问返回一个以字符串指定类名的类的对象。 88、Jdo是什么? 答:JDO是Java对象持久化的新的规范,为javadata ob...
  • u010129251
  • u010129251
  • 2015年04月02日 17:43
  • 514

JDO与JPA哪个更好?

今天偶然在网上看到了JDO,而我以前学的是JPA,那么两种有什么联系呢?或者说哪个更好?下面我先介绍两种的含义。 JDO的全文是:Java Data Object,就是对象持久化的新的规范。也是一个...
  • wu560130911
  • wu560130911
  • 2013年03月20日 17:09
  • 1552

DataNucleus之JDO操作示例

JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API。注意JDO是一种规范,而不是一个产品。而DataNucleus正是实现J...
  • xtayfjpk
  • xtayfjpk
  • 2014年05月08日 17:00
  • 2479

Hive并发情况下报DELETEME表不存在的异常

线上脚本在并行某些hive任务后,偶然会报出一个DELETEME表不存在的异常,异常信息大致如下: FAILED: Error in semantic ana...
  • zxc2zxc120
  • zxc2zxc120
  • 2014年10月28日 17:53
  • 729

JDO快速入门指南

JDO快速入门 Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语...
  • chunyufeiyun
  • chunyufeiyun
  • 2013年09月02日 08:44
  • 776

在Hibernate中开启日志

在Hibernate中开启日志作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs在项目中,如果要排查故障,找出Bug,离不开日志信息。那么在Hibernate...
  • chszs
  • chszs
  • 2015年06月13日 14:01
  • 9001

Hibernate工作原理及其优点

hibernate 简介: hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。 hibernate...
  • u013551462
  • u013551462
  • 2016年04月30日 12:11
  • 12638

一个简单的Hibernate登录实例

这是一个关于Hibernate登录的实例,开发工具:MyEclipse2014,mysql,jdk,hibernate, struts2。下面是实例的具体步骤。   1.   新建一个Web Pr...
  • moon__stone888888
  • moon__stone888888
  • 2016年07月04日 21:37
  • 2685

Hibernate入门学习(一)

Hibernate工作闲暇之余学习入门
  • fb281906011
  • fb281906011
  • 2013年12月28日 15:24
  • 18295

Hibernate基本用法:体系结构

ORM概述: ORM:Object/Relation Mapping,对象/关系数据库映射。Hibernate是ORM框架的一种。 ORM是面向对象程序设计语言和关系数据库之间的桥梁,ORM完成了...
  • u012355934
  • u012355934
  • 2017年04月16日 22:31
  • 1856
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate与JDO肩并肩
举报原因:
原因补充:

(最多只允许输入30个字)