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

反思Hibernate,可以有更简洁、更高效的ORM实现

 
阅读更多
  我思考了良久才决定发这篇文章,各位老大手下留情。

  假设有一张表Student,有几个字段ID,Name,Gender,BirthDay,实际上这么一个从数据库设计中直接生成的类就可以很好地满足我们对于ORM的要求:

public class StudentSchema extends Schema {
	private int ID;

	private String Name;

	private String Gender;

	private Date BirthDay;

	public static final TableName = "Student";

	public static final PrimaryKeys PKs = new PrimaryKeys(new String[] { "ID" });

	public Date getBirthDay() {
		return BirthDay;
	}

	public void setBirthDay(Date birthDay) {
		BirthDay = birthDay;
	}

	public String getGender() {
		return Gender;
	}

	public void setGender(String gender) {
		Gender = gender;
	}

	public int getID() {
		return ID;
	}

	public void setID(int id) {
		ID = id;
	}

	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}
}


  其中Schema是一个公用类,里面主要是提供了fill(),update(),delete(),backup()等功能。其中fill()就是通过主键返回一条记录,其他几个方法就不用说了吧。

  但反观Hibernate呢?我们需要一个与StudentSchema类似的POJO类,一个DAO类,一个*.hbm.xml映射文件,才能达到类似的效果,机制繁琐,性能消耗明显要高。

  我不知道为什么这么简单的高下立见的对比没有引起大家的注意,我也承认我对Hibernate浅尝辄止,并且我估计会引来大片的攻击,但我确实想像不出Hibernate有可能会比这更简洁更高效。在我们的实际应用中,StudentSchema是由工具从PowerDesigner中直接生成的,开发人员根本不管ORM,直接使用即可。StudentSchema是硬编码的类,不需要进行字节码动态生成,不需反射,不需配置文件,十分简单。

  更重要的是,我们这个ORM实现总共才几千行代码。Hibernate功能很多,但我们的ORM实现虽然代码很少,但己能覆盖实际开发中的全部ORM需求。我将以回复的方式加以说明。
分享到:
评论
71 楼 maoxiaolu2000 2009-06-08  
楼主这个不知对于where部分的封装是怎么样
能否给讲解一下
对于参数的类型如何做比较高效的判断

public QueryBuilder(String sql,Object...obj)

70 楼 kaki 2009-06-08  
要用面向对象的思想去思考。
69 楼 wyuch 2009-06-08  
redhat 写道
没看见实现关联,导航?继承呢?

没有这些,开发起来更痛苦。


没提供和Hibernate类似的导航,他和级联是相关的,不可能没有级联但单独实现导航。
第4页帖提供了实现级联的方式,相应的也有实现导航的方式。

至于继承,一个类对应一个表的继承方式肯定必须要实现的。所以我理解你意思应该是问除了这个其他的继承映射方式有没有实现。答案是没有,他跟级联是一类问题。

目前我们用得还不错,没有感觉到痛苦。可能这个跟数据库的设计风格有关系,我们喜欢将数据库中表划分到不同的模块下(具体就是PowerDesigner中的PhysicalDiagram),模块与模块之间的表基本上没有关联,所以表与表之间的关联不太复杂。

应该承认Hibernate在级联和导航上比我们要做得好,虽然我们的也工作得很好,但要多写三行代码。我们思考后发现实现级联和导航其实不会增加太多的复杂性,在我们现有代码的基础上稍作扩展即可,代码行数估计在500以下,所以我们准备花两周时间实现这两个特性。
68 楼 redhat 2009-06-08  
没看见实现关联,导航?继承呢?

没有这些,开发起来更痛苦。
67 楼 redhat 2009-06-08  
没看见实现关联,导航?继承呢?

没有这些,开发起来更痛苦。
66 楼 wyuch 2009-06-08  
zhaomingzm_23 写道
任何事物都是存在多样性的,不能排斥他们,
正因为如此世界才如此的多姿多彩,存在即是合理的。

不喜欢Hibernate,或者没有时间去啃用户指南。可以理解。
但大家都不希望看到"反思XXX框架"的标题党。

还有就是实例代码最好不要在项目里copy -> paste
处处有项目名痕迹对贵公司知识产权和对技术的交流都是非常不利的。


你说得有部分道理。

但我现在倒是觉得不是那么标题党,首先诚恳地说我写标题的时候并没有哗众取宠的意思。其次我的目的是想和Hibernate做对比,按照前面几位朋友的逻辑,依我目前对Hibernate的掌握程序,我反思是不行的,对比估计也不行,请问我应该用什么标题才合适?再次,反思大体是指看到某个事件再回头看另一个事物的意思,大家经常可以从各种地方可以看到反思的字样,难道这些反思都是由相关领域很资深的人士作出的吗?只能说我反思可能会有深度不够的问题,但请不要剥夺我反思的权利。

这个项目迟早要开源的,所以从我们的角度出发倒是无所谓的。如果对大家有妨碍,我只能表示歉意了。
65 楼 wyuch 2009-06-08  
fireflyc 写道

恩。这些代码没有证明比hibernate更好。这里是没有DAO,但是有一个类似DAO角色的东西。叫它增强的entityManager更合适。我的代码中起名叫DAO而已,你的起名叫SietUserSchema而已。那么既然不能够比最佳实践后的hibernate写出来的代码简单,唯一能支撑的原因便是因为它足够的小。这足够小的背后隐藏的是不是足够的弱?Hibernate为了解决SQL到面向对象SQL的问题设计了HQL,用词法分析的方式实现,为了实现缓存的更新,对字节码进行了增强。为了能够适应各种数据库产品设计了一系列的SQL生成引擎。我觉得为了一个高强度的ORM这些做法是很有必要的。而且Hibernate还是JPA规范的一种实现,如此种种决定了hibernate是必须要这么多代码量的。况且hibernate的曲线没有那么复杂,你觉得我上面的代码交给一个新手写困难吗?(我们的代码很像不是吗?)


我说的很充分了,我的代码比你的少,“没有其他类,没有配置”,难道不比你的代码要简单?
另一方面且我的机制比你的简单,到父类Schema就是直接封装JDBC了,没有HQL,没有动态字节码,效率等同于JDBC。

虽然我的ORM实现足够小,但功能足以覆盖全部需求,只是你没有看我前面的帖子,我提供了例子的。
我直接使用原生SQL,不做语法分析,也可以轻易写出数据库兼容的软件,很多数据库操作都是通过Schema来完成的。我们的产品本身就是数据库兼容,但没有Hibernate多,只兼容Oracle,DB2,SQL Server和Mysql。

我觉得你说的那些所谓高强度的ORM必要的功能,其实跟高强度关系并不大,只是一个希望提供所有功能的ORM必要的。实际上我们的系统正运行在高并发的情况之下。

再说说学习曲线的问题。都是为了解决一个问题,所以写出来的代码相似是正常的,但Hibernate可能需要学习几周才能写出这样的代码,但我的ORM不言自明,只需几十分钟。你认为Hibernate的配置文件、HQL、级联关系、对象一致性以及许多必须要知道的类和方法是很轻松能学会的?

其实我觉得他说得很对,我们是两种理念的不同。
treenode 写道

有的人就是喜欢简单的解决办法,不希望额外的复杂性;
有的人就是想要all-in-one的解决方案,并且认为由此带来的复杂性是合理的。
64 楼 zhaomingzm_23 2009-06-08  
任何事物都是存在多样性的,不能排斥他们,
正因为如此世界才如此的多姿多彩,存在即是合理的。

不喜欢Hibernate,或者没有时间去啃用户指南。可以理解。
但大家都不希望看到"反思XXX框架"的标题党。

还有就是实例代码最好不要在项目里copy -> paste
处处有项目名痕迹对贵公司知识产权和对技术的交流都是非常不利的。
63 楼 風一樣的男子 2009-06-08  
关注各位大牛们的讨论
62 楼 favor 2009-06-08  
一个是长远利益(hibernate),一个是短期利益(lz).都有优点,看目标了!
61 楼 redish 2009-06-08  
楼住的这个东西个人觉得不错,很合适我目前的小项目,期待开源。
60 楼 fireflyc 2009-06-08  
wyuch 写道
fireflyc 写道

在Hibernate才是被我们玩而不是我们被它玩了。


如果一种技术使得开发人员有被它玩的风险,那么它本身确实很值得玩味了。

我用我们的框架来重写一下你的代码:
	public SiteUserSet findUserByPage(int pageno) {
		return new SiteUserSchema().query("", Constants.PAGE_SIZE , pageno);
	}

	public void saveUser(String userName) {
		SiteUserSchema su = new SiteUserSchema();
		su.setName(userName);
		su.setSiteId(UUIDGenerator.generateUUID());
		su.setPwd(MD5.crypt(su.calPwdCode()));
		su.insert();
	}

	public void updateUser(String userId, String userName) {
		SiteUserSchema su = new SiteUserSchema();
		su.setUserId(userId);
		su.fill();
		su.setName(userName);
		su.setSiteId(UUIDGenerator.generateUUID());
		su.setPwd(MD5.crypt(entity.calPwdCode()));
		su.update();
	}

	public SiteUserSchema auth(String userName, String siteId) {
		SiteUserSchema su = new SiteUserSchema();
		SiteUserSet set = su.query(new QueryBuilder("FROM SiteUser WHERE name=? AND siteId=?",userName,siteId));
		if(set.size()>0){
			return null;
		}else{
			return set.get(0);	
		}
	}


以上就是全部,没有名存实亡的siteUserDAO,没有其他类,没有配置。

恩。这些代码没有证明比hibernate更好。这里是没有DAO,但是有一个类似DAO角色的东西。叫它增强的entityManager更合适。我的代码中起名叫DAO而已,你的起名叫SietUserSchema而已。那么既然不能够比最佳实践后的hibernate写出来的代码简单,唯一能支撑的原因便是因为它足够的小。这足够小的背后隐藏的是不是足够的弱?Hibernate为了解决SQL到面向对象SQL的问题设计了HQL,用词法分析的方式实现,为了实现缓存的更新,对字节码进行了增强。为了能够适应各种数据库产品设计了一系列的SQL生成引擎。我觉得为了一个高强度的ORM这些做法是很有必要的。而且Hibernate还是JPA规范的一种实现,如此种种决定了hibernate是必须要这么多代码量的。况且hibernate的曲线没有那么复杂,你觉得我上面的代码交给一个新手写困难吗?(我们的代码很像不是吗?)
59 楼 bcw104 2009-06-08  
wyuch 写道

我不介意跟什么东西做比作为一个技术人员出身的创业者,我关心的核心问题是学习曲线、开发效率,简而言之,是少发工资多做事。

你够狠,不不如说不给钱白给你干呢.
58 楼 wyuch 2009-06-07  
lonlyleo 写道

这年头,找个精通hibernate的也不容易,但找个会用hibernate的却很容易阿。
个人觉得创业其实用hibernate更好一点,免得以后你自创的框架在你不上前线的时候后续乏力。。。


如果团队里没有精通Hibernate的人,那肯定是不能放心用Hibernate的呀,系统出现未遇到过的持久层问题了怎么办?

这个自创的ORM框架机制简单,团队成员里还是有不少人可以自行修改的。
57 楼 wyuch 2009-06-07  
lonlyleo 写道
我一直都觉得自己对hibernate的理解还很不够,因此也会关注一些帖子。
不过不太同意楼主“反观”的这种观点,hibernate是很优秀的,只不过大部分项目可能觉得自己并不需要这么复杂的东西,在可预料的将来也不太会用到hibernate的复杂特性而已。

看过楼主的代码,感觉可以称之为传统数据库编码的一种经验性封装,这种思路应该可以用在我们的某些项目上,只是,现在团队对hibernate的应用几乎已经感觉不到什么影响了(甚至已经很长时间消失在团队的讨论当中了),我们没有需求去自己造这个轮子:)


我比较认同你的观点,我也认为Hibernate是很优秀的,但功能太丰富了太庞大了,以至不够简洁,而很多开发团队确实不需要这么功能强大的东西,所以一个简洁高效的轻量级ORM实现对于一些团队还是有必要的。

这也确实要看团队的实际情况,像你们的团队成员都已经熟悉Hibernate了,那当然没有另起炉灶的必要了。

ORM的本来目的就是对JDBC提供一种面向对象的封装,我们之所以自己开发一个这样的ORM,一方面跟我们自己的经历有关,另一方面也是因为这个轮子太容易造了。
56 楼 visualcatsharp 2009-06-07  
hibernate的伟大之处是让我们懂得了不需要hibernate!
55 楼 lonlyleo 2009-06-07  
wyuch 写道
梦秋雨 写道
看来看去,觉得楼主这个东西根本不是ORM,其目标也不是去解决ORM的问题,整个就是一个dbutils,如果比较可以去和apache里面的dbutils比较一下还差不多。

不是说把数据表里面的一个个字段,都自动化或者半自动化的转换为类里面的一个个简单属性就可以叫做ORM了。

地球人都知道ORM是用来解决对象模型和关系模型的不匹配的,于是级联、对相关联、面向对象的查询方式才是ORM的主要课题。楼主这个东西是什么?


我不知道你的ORM定义来自哪里,不认同我的观点的人很多,但觉得我的压根就不是ORM的你还是第一个。

我不介意跟什么东西做比较,作为一个技术人员出身的创业者,我关心的核心问题是学习曲线、开发效率,简而言之,是少发工资多做事。


这年头,找个精通hibernate的也不容易,但找个会用hibernate的却很容易阿。
个人觉得创业其实用hibernate更好一点,免得以后你自创的框架在你不上前线的时候后续乏力。。。
54 楼 lonlyleo 2009-06-07  
我一直都觉得自己对hibernate的理解还很不够,因此也会关注一些帖子。
不过不太同意楼主“反观”的这种观点,hibernate是很优秀的,只不过大部分项目可能觉得自己并不需要这么复杂的东西,在可预料的将来也不太会用到hibernate的复杂特性而已。

看过楼主的代码,感觉可以称之为传统数据库编码的一种经验性封装,这种思路应该可以用在我们的某些项目上,只是,现在团队对hibernate的应用几乎已经感觉不到什么影响了(甚至已经很长时间消失在团队的讨论当中了),我们没有需求去自己造这个轮子:)
53 楼 treenode 2009-06-07  
从这个帖子可以看到:
有的人就是喜欢简单的解决办法,不希望额外的复杂性;
有的人就是想要all-in-one的解决方案,并且认为由此带来的复杂性是合理的。

如果无法达成共同的理念的话,那么这两类人凑在一起,永远都是鸡同鸭讲
52 楼 shanghui_12 2009-06-07  
支持楼主,可以从上网本的流行现象来反思orm,我们真的需要那么多吗?适合自己的就是最好的,能为公司带来直接效益的就是最佳选择。

相关推荐

    Hibernate框架ORM的实现原理

    ### Hibernate框架ORM的实现原理详解 #### 一、ORM概念及意义 **ORM**,即**对象关系映射**(Object Relational Mapping),是一种程序...了解Hibernate的实现原理有助于更好地运用这一框架,解决实际开发中的问题。

    Hibernate orm 实现原理

    Hibernate orm 实现原理 主要讲解了关于hibernate 的一些知识

    hibernate-orm-master.zip

    在实际开发中,理解并熟练运用这些核心概念和机制,可以帮助我们更高效地利用Hibernate ORM进行数据访问层的设计,减少数据库操作的复杂性,提高代码的可维护性。对于初学者,建议从简单的JAR包开始,逐步熟悉其API...

    HibernateORM

    Hibernate作为Java领域广泛使用的ORM框架,它极大地简化了数据库操作,将面向对象的编程思想与关系型数据库相结合,使得开发者可以更加专注于业务逻辑,而不是繁琐的SQL语句。在本书中,作者深入浅出地讲解了如何...

    hibernate-orm-3.3源码

    总结,通过分析《hibernate-orm-3.3源码》,我们可以深入理解 Hibernate 的工作机制,掌握如何高效地使用 ORM 技术,以及如何根据需求扩展和定制 Hibernate。对于任何想提升数据库操作效率和代码可维护性的 Java ...

    ORM hibernate。jar包

    标题提到的"ORM Hibernate .jar包"指的是Hibernate框架的可执行库文件,通常包含了一系列类、接口和实现,供开发者在项目中引用,以实现ORM功能。"hibernate5+jars包"表明这是Hibernate的第五个主要版本,5.2.16....

    hibernate-orm-4.3.9源码

    本文将基于从Hibernate官网下载的hibernate-orm-4.3.9源码,深入解析其内部机制,帮助开发者更好地理解和应用Hibernate。 一、Hibernate概述 Hibernate的核心功能是将Java对象与数据库表进行映射,实现了数据持久...

    Hibernate_ORM步骤详解

    Hibernate ORM 是一种强大的Java持久层框架,它实现了对象关系映射(ORM)的概念,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。在本教程中,我们将详细介绍如何利用Hibernate 3...

    hibernate-orm-3.2.zip

    Hibernate ORM 是一个强大的Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的数据交互...虽然现在Hibernate已经发展到了更高级的版本,但理解3.2的基础知识仍然有助于理解ORM的本质和工作原理。

    hibernate-orm-master

    hibernate-orm-master

    hibernate-search-orm-4.4.2.Final.zip

    总结来说,Hibernate Search ORM 4.4.2.Final是Java开发中实现全文检索的强大工具,而AtomicMapOperations则提供了并发映射的非阻塞原子操作,两者结合可以构建出高性能、高并发的搜索应用。对于任何处理大量数据和...

    hibernate-framework-orm-4.2.4.Final.zip

    Hibernate作为ORM工具,主要解决了Java应用与数据库之间的数据交互问题,通过将数据库表映射为Java类,实现对象与数据的自动转换。这使得开发者可以使用面向对象的方式来操作数据库,降低了数据库操作的复杂性。 2...

    自定义Orm框架的实现

    本项目旨在实现一个基于JDK5.0注解的小型ORM框架,模拟Hibernate的部分功能。 首先,我们要理解ORM的基本原理。ORM的核心思想是将数据库中的表映射为Java对象,将表中的记录映射为对象的实例,这样就可以通过操作...

    org.springframework.orm.hibernate3.LocalSessionFactoryBean

    ### 关于 "org.springframework.orm.hibernate3.LocalSessionFactoryBean" 未找到问题的知识点解析 #### 一、问题背景 在开发基于Spring与Hibernate整合的应用时,可能会遇到“`org.springframework.orm.hibernate...

    Hibernate源码(hibernate-orm-main.zip)

    Hibernate源码(hibernate-orm-main.zip)Source Code: Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。 它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    Hibernate ORM - 一对多双向关联关系

    在Hibernate中,这种关系可以通过`@OneToMany`注解实现。例如,User类可能会有如下注解: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ...

    ORM的简单介绍及相应ORM工具Hibernate的使用规则

    对象关系映射的概念,及相应Hibernate的使用规范,同时通过实例展示到底什么是对象关系映射。

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

Global site tag (gtag.js) - Google Analytics