`

hibernate~~~xml and annotations(2)

阅读更多
Hibernate Annotations 实战(二)
 
<script language="javascript" src="http://java.chinaitlab.com/JS/und_title_left.js"></script><script language="javascript" src="http://security.chinaitlab.com/JS/tech_title_safe3.js"></script> 全球最大事件 4千万信用卡资料被盗
 小心!黑客利用Google挖掘你的隐私
 GOOGLE对SSL VPN安全性造成威胁
  <script language="javascript" src="http://java.chinaitlab.com/JS/und_title_right.js"></script>西门子新款上市报价
<script language="javascript" src="http://server.chinaitlab.com/JS/tech_title_s3.js"></script> 刀片服务器与机架服务器优势完全对比
 惠普机架式服务器促销中仅售91520元
 
Matrix  2006-1-11  保存本文  推荐给好友  QQ上看本站  收藏本站

在这篇文章中我们就来讨论一下 hbm.xml 与 Annotations的优缺点,看看那种情况最适合你.

首先,讨论一下 xml 配置文件的优点, 个人认为主要优点就是当你改变底层配置时 不需要改变和重新编译代码,只需要在xml 中更改就可以了,例如 Hibernate.cfg.xml 当你要更改底层数据库时, 只要更改配置文件就可以了.Hibernate会为你做好别的事情.

那么xml的缺点呢,个人认为有以下几点:

  • 描述符多,不容易记忆,掌握 要深入了解还有看DTD文件
  • 无法做自动校验,需要人工查找
  • 读取和解析xml配置要消耗一定时间,导致应用启动慢,不便于测试和维护
  • 当系统很大时,大量的xml文件难以管理
  • 运行中保存xml配置需要消耗额外的内存
  • 在O/R Mapping的时候需要在java文件和xml配置文件之间交替,增大了工作量

其中第一 二点 借助于先进的IDE 可能不是什么问题. 但是对初学者还是个问题

下面我们看看 Annotations的 特性吧! 可以解决xml遇到的问题,有以下优点

  • 描述符减少。以前在xml配置中往往需要描述java属性的类型,关系等等。而元数据本身就是java语言,从而省略了大量的描述符
  • 编译期校验。错误的批注在编译期间就会报错。
  • 元数据批注在java代码中,避免了额外的文件维护工作
  • 元数据被编译成java bytecode,消耗的内存少,读取也很快,利于测试和维护

关于映射文件是使用 hbm.xml 文件还是使用 Annotations 我们来看看2者的性能吧. 先声明一下,个人认为映射文件一旦配置好就不会在很大程度上改变了.所以使用xml文件并不会带来很大的好处.如果你认为 映射文件在你的项目中也经常变化,比如一列String数据 ,今天你使用 length="16" 明天你认为 该数据的长度应该更长才能满足业务需求 于是改为length="128" 等等类似的问题 . 如果你经常有这方面的变动的话,下面的比较你可以不用看了 , 你应该使用 xml文件 因为Annotations 无法很好的满足你的要求.

现在让我们就来看看2者的性能比较吧.

(说明: 这里只是比较查找 插入 的时间快慢,没有比较除运行时间以外的其他性能,如 内存占用量 等等)

先来看看测试程序和配置.

首先在 Hibernate.cfg.xml 文件中去掉了

<property name="hibernate.hbm2ddl.auto">update</property>

这一行, 因为在前面的实验中以及建立了数据库表了 不再需要更新了.如果你是第一次运行该例子 还是要该行的.

Test.java 如下:

/*
 * Created on 2005
 * @author 
 */
package test.hibernate.annotation;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class Test {
  
  public static void main(String [] args) {
    long start = 0;
    long end = 0;
    start = System.currentTimeMillis();  //程序开始时间
    
    Session s = HibernateUtil.currentSession();
    long mid =  System.currentTimeMillis();  //初始化完毕的时间 (可能此时并没有初始化完毕^_^)
    
    Transaction tx = s.beginTransaction();    
    /********************测试读取的代码************************/
    Person p = null;
    for(int i = 1; i <= 100; i ++) {
    p = (Person) s.get(Person.class, i);
    System.out.println(p.getName());
    }
    System.out.println(p.getName());

    /********************测试读取1次的代码************************/
    Person p = null;
    p = (Person) s.get(Person.class, 1);
    System.out.println(p.getName());
    /*********************测试插入的代码*************************************/
    /*
    for (int i = 0; i < 100; i ++) {
      Person p = new Person();
      p.setAge(i+1);
      p.setName("icerain"+i);
      p.setSex("male"+i);
      s.save(p);
      s.flush();
    }
    */
    tx.commit();
    HibernateUtil.closeSession();
    
    end = System.currentTimeMillis(); //测试结束时间
    System.out.println("String[] - start time: " + start);
    System.out.println("String[] - end time: " + end);
    System.out.println("Init time : " + (mid-start)); // 打印初始化用的时间
    System.out.println("Last time is :" +(end - mid) ); //打印 数据操作的时间
    System.out.println("Total time : " +(end - start)); //打印总时间
  }
}

Annotations 包中的Person.java 如下

package test.hibernate.annotation;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.AccessType;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * Person generated by hbm2java
 */

@SuppressWarnings("serial")
@Entity(access = AccessType.PROPERTY)
@Table
public class Person implements java.io.Serializable {
  private Integer id;
  private String name;
  private String sex;
  private Integer age;
  private List list = new LinkedList();

  // Constructors
  /** default constructor */
  public Person() {
  }

  /** constructor with id */
  public Person(Integer id) {
    this.id = id;
  }

  // Property accessors
  @Id(generate=GeneratorType.AUTO)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @Basic
  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Basic
  public String getSex() {
    return this.sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  @Basic
  public Integer getAge() {
    return this.age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }
  @Transient
  public List getList() {
    return list;
  }
  public void setList(List list) {
    this.list = list;
  }

}

其他的代码几乎没有改变:

下面的每种类型的测试都测试了3次以上, 取中间的测试时间.

测试机器配置:

CPU:  AMD Athlon (xp) 2000+

内存: 784880KB

硬盘: 三星 SP0812N

读取一次  的比较:(单位: 毫秒)

使用Annotations 的测试数据 使用Xml文件的测试数据 简要说明
Init time : 2444 Init time : 2431 测试前我认为该项结果xml应该比较大,要读取映射文件啊,实际情况不是这样,不知道为什么?
Last time is : 62 Last time is : 85 相差比较大不知道为什么?
Total time : 2506 Total time : 2516 xml文件总体上慢了一点

   读取100次的比较:

使用Annotations 的测试数据 使用Xml文件的测试数据 简要说明
Init time : 2437 Init time : 2422 和前面初始化差不多
Last time is : 438 Last time is : 484 有时间差
Total time : 2875 Total time : 2906 也是xml文件总体上慢了一点

插入100次的比较:

使用Annotations 的测试数据 使用Xml文件的测试数据 简要说明
Init time : 2453 Init time : 2469 和前面初始化差不多
Last time is : 469 Last time is : 656 有时间差
Total time : 2922 Total time : 3125 也是xml文件总体上慢了一点

  从上面的三次对比中大家可以看到 初始化的部分几乎两者是一样的, 在数据操作上面 使用xml文件 总是比使用Annotations 慢一点.在我们只操纵一个只有几个属性的小持久化类的操作中就有 几十毫秒的差距. 几十毫秒在计算机中算不算很大 大家应该都知道,我就不在多说了.

  总结: 经过 xml 文件 和Annotations 的优缺点和 性能上的对比.现在使用那个作为你持久化映射策略.我相信大家都会正确选择的.

分享到:
评论

相关推荐

    hibernate annotations3.4.0 GA.rar

    都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式

    hibernate-annotations-3.4.0.GA

    Hibernate Annotations是Hibernate 3.x系列引入的新特性,它允许开发者在Java实体类上直接使用注解来定义对象关系映射信息,替代了传统的Hibernate XML配置文件。这种注解方式提高了开发效率,减少了配置文件的维护...

    hibernate annotations

    Hibernate Annotations是Hibernate框架的一个重要组成部分,它允许开发人员通过在Java实体类上使用注解来定义数据模型,从而避免了传统的XML配置文件。这种做法提高了代码的可读性和维护性。 **核心概念** 1. **...

    Hibernate Annotations 中文文档

    Hibernate Annotations API 中文文档 前言 1. 创建一个注解项目 1.1. 系统需求 1.2. 系统配置 2. 实体Bean 2.1. 简介 2.2. 用EJB3注解进行映射 2.2.1. 声明实体bean 2.2.1.1. 定义表(Table) 2.2.1.2. 乐观...

    HibernateAnnotations 中文版

    Hibernate Annotations 是 Hibernate 的一个重要组成部分,它引入了注解(Annotation)机制,使得开发者无需编写 XML 配置文件,就可以实现对象和数据库表之间的映射。 ### Hibernate ORM 基础 1. **对象关系映射...

    hibernate annotations 中文参考手册

    可以通过 `hibernate.hbm2ddl.auto` 配置属性控制自动生成行为。 ##### 外部配置 除了通过注解配置实体映射之外,还可以使用 XML 文件或者基于 Java 的配置方式来定制更复杂的映射规则。 #### 总结 通过使用 ...

    hibernate xml annotations

    Hibernate XML annotations是Hibernate早期版本中使用的一种方式,它结合了XML配置文件和注解,用于定义实体类与数据库表之间的映射关系。 在Hibernate中,XML配置文件通常命名为`hibernate.cfg.xml`,它包含了...

    hibernate-annotations.jar

    《Hibernate Annotations 框架详解》 在Java领域,Hibernate是一个广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作。而`hibernate-annotations.jar`是Hibernate框架中的一个重要组件,主要负责处理...

    hibernate-annotations

    Hibernate Annotations是Hibernate 3.x引入的一个模块,它允许开发者使用Java 5及以上版本的注解来定义对象关系映射,替代传统的XML配置文件。3.4.0.GA版本是该组件的一个稳定版本,修复了大量已知问题,提高了性能...

    hibernate-annotations 相关jar包

    在Hibernate中,Hibernate Annotations是一个重要的组成部分,它引入了JPA(Java Persistence API)的注解,使得对象-关系映射更加简洁且无需XML配置。 **一、Hibernate Annotations简介** Hibernate Annotations是...

    hibernate-annotations-3.4.0.GA and hibernate-entitymanager-3.4.0.GA

    本篇将详细探讨`hibernate-annotations-3.4.0.GA`和`hibernate-entitymanager-3.4.0.GA`这两个版本中的核心知识点,尤其是它们在注释和枚举映射方面的应用。 首先,`hibernate-annotations`是Hibernate提供的一套...

    Hibernate-annotations-3.4最新版本

    Hibernate-annotations-3.4.0.GA是Hibernate的一个重要分支,它引入了注解功能,使得开发者无需编写XML配置文件,就能完成对象与数据库表的映射。这一改进不仅降低了项目的复杂性,也提高了开发效率,尤其在处理大型...

    Hibernate3.2 Annotations中文文档

    在Hibernate 3.2版本中,引入了Annotations特性,这是一种更加简洁、直观的方式来描述对象与数据库表之间的映射关系,取代了之前的XML配置文件。这个文档提供了详细的中文指南,帮助开发者理解和应用Hibernate 3.2的...

    hibernate-annotations-3.4.0(参考文档,doc/../index.html)

    Hibernate Annotations是Hibernate框架的一个扩展,它允许开发者使用Java语言的注解(Annotations)来定义对象与数据库表之间的映射关系,替代传统的Hibernate XML配置文件。这使得代码更加简洁,更易于维护,并且与...

    hibernate3.3.2所有jar包及xml配置文件

    2. hibernate-annotations.jar:提供了注解支持,让开发者可以在Java类上直接声明数据库映射。 3. hibernate-entitymanager.jar:用于JPA(Java Persistence API)的支持。 4. hibernate-commons-annotations.jar:...

    hibernate_annotations.rar

    Hibernate注解是Hibernate框架的一个关键特性,它允许开发者通过在Java类和属性上添加元数据注解,来定义对象与数据库表之间的映射关系,替代了传统的XML配置方式。以下是关于Hibernate注解的一些重要知识点: 1. ...

    hibernate3-[annotations-commons-annotations].rar

    《Hibernate3:注解与Commons Annotations的深度解析》 Hibernate3是一款强大的Java持久化框架,它极大地简化了数据库操作,使得开发者可以专注于业务逻辑,而不是底层的数据访问细节。本篇将深入探讨Hibernate3中...

    hibernate-annotations-3.4.0.jar

    Hibernate Annotations是Hibernate框架的一个扩展,引入了JPA(Java Persistence API)的注解,使得开发人员无需编写XML配置文件即可进行对象持久化。`3.4.0`版本是Hibernate Annotations的一个稳定版本,它包含了...

    hibernate-annotations-3.4.0.GA+hibernate-distribution-3.3.2.GA-dist

    而Hibernate Annotations则是Hibernate框架的重要组成部分,它使得我们可以在实体类上直接使用注解进行对象关系映射,避免了XML配置文件的繁琐。本文将深入探讨Hibernate 3.3.2和Hibernate Annotations 3.4.0的核心...

Global site tag (gtag.js) - Google Analytics