全面概括Hibernate Annotations

开发 后端
这里介绍关于映射文件是使用 hbm.xml 文件还是使用 Hibernate Annotations 我们来看看2者的性能吧. 先声明一下,个人认为映射文件一旦配置好就不会在很大程度上改变了.

本文向大家介绍Hibernate Annotations,可能好多人还不了解Hibernate Annotations,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

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

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

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

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

下面我们看看 Hibernate Annotations的特性吧! 可以解决xml遇到的问题,有以下优点
◆描述符减少。以前在xml配置中往往需要描述java属性的类型,关系等等。而元数据本身就是java语言,从而省略了大量的描述符
◆编译期校验。错误的批注在编译期间就会报错。
◆元数据批注在java代码中,避免了额外的文件维护工作
◆元数据被编译成java bytecode,消耗的内存少,读取也很快,利于测试和维护

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

现在让我们就来看看2者的性能比较吧.(说明: 这里只是比较查找 插入 的时间快慢,没有比较除运行时间以外的其他性能,如 内存占用量 等等)

先来看看测试程序和配置.首先在 Hibernate.cfg.xml 文件中去掉了

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

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

  1. /*  
  2.  * Created on 2005  
  3.  * @author   
  4.  */  
  5. package test.hibernate.annotation;  
  6.  
  7. import org.hibernate.Session;  
  8. import org.hibernate.Transaction;  
  9.  
  10. public class Test {  
  11.  
  12. public static void main(String [] args) {  
  13. long start = 0;  
  14. long end = 0;  
  15. start = System.currentTimeMillis();//程序开始时间  
  16.  
  17. Session s = HibernateUtil.currentSession();  
  18. long mid =System.currentTimeMillis();  
  19. //初始化完毕的时间  
  20.  
  21. Transaction tx = s.beginTransaction();  
  22. //测试读取的代码  
  23. Person p = null;  
  24. for(int i = 1; i <= 100; i ++) {  
  25. p = (Person) s.get(Person.class, i);  
  26. System.out.println(p.getName());  
  27. }  
  28. System.out.println(p.getName());  
  29.  
  30. //测试读取1次的代码  
  31. Person p = null;  
  32. p = (Person) s.get(Person.class, 1);  
  33. System.out.println(p.getName());  
  34. //测试插入的代码  
  35. /*  
  36. for (int i = 0; i < 100; i ++) {  
  37. Person p = new Person();  
  38. p.setAge(i+1);  
  39. p.setName("icerain"+i);  
  40. p.setSex("male"+i);  
  41. s.save(p);  
  42. s.flush();  
  43. }  
  44. */  
  45. tx.commit();  
  46. HibernateUtil.closeSession();  
  47.  
  48. end = System.currentTimeMillis(); //测试结束时间  
  49. System.out.println("String[] - start time: " + start);  
  50. System.out.println("String[] - end time: " + end);  
  51. System.out.println("Init time : " + (mid-start));   
  52. // 打印初始化用的时间  
  53. System.out.println("Last time is :" +(end - mid) );   
  54. //打印 数据操作的时间  
  55. System.out.println("Total time : " +(end - start));   
  56. //打印总时间  
  57. }  
  58. }  

【编辑推荐】

  1. Hibernate对数据索引进行缓存
  2. 剖析Hibernate主键生成几种常用方式
  3. 浅析Hibernate实现实体对象延迟加载
  4. Hibernate集合类型的延迟加载特性
  5. 概括Hibernate属性延迟加载
责任编辑:佚名 来源: 51CTO.com
相关推荐

2009-09-29 10:12:03

Hibernate A

2009-09-21 16:56:14

Hibernateibatis

2009-09-21 16:40:42

Hibernate可行

2009-09-27 16:01:04

Hibernate A

2009-09-24 09:25:10

Hibernate批量

2009-09-28 15:24:38

Hibernate V

2009-09-25 15:15:54

Hibernate检索

2009-09-22 13:31:28

Hibernate C

2009-09-29 16:29:40

Hibernate查询

2009-09-22 17:55:51

Spring Hibe

2009-09-27 14:33:01

Hibernate批量

2009-09-22 09:31:15

Hibernate主键

2009-09-28 09:56:53

Hibernate属性

2009-09-16 16:55:07

LINQ to XML

2009-09-25 13:18:15

Hibernate数据

2009-09-22 13:12:25

Hibernateibatis

2009-09-22 09:40:03

cascade和invHibernate

2009-09-23 18:05:48

2009-09-22 14:52:55

Hibernate p

2009-09-25 10:22:35

Hibernate多表
点赞
收藏

51CTO技术栈公众号