`
xyz20003
  • 浏览: 292808 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

不选或许有千万种理由,但是选择hibernate只需要一个理由就足够了

阅读更多
选择一门新技术,首先要看这门技术是否能够满足目前应用的需求,我们承认任何事物都不会十分完美的同时,也在不断追求着能够为本身应用带来巨大价值的途径。

简单来说,就是因为我们很懒,所以我们会一直寻找能帮我们减轻工作量的东西。

因此,hibernate才能被社区广泛接受,这些团队选用hibernate到底是因为什么原因呢?

1.hibernate是一个orm框架,可以自动完成object和关系数据库之间的转换,加速开发

  这一点就是hibernate最大的特色,不管以前有没有玩过jdbc,看到了hibernate的hello world演示之后估计没有不赞叹的:“操作数据库怎么可能这么简单,hibernate简直是从火星来的哦。”

2.hibernate可以跨数据库

  这一点其实是实现了orm的后遗症,为了实现一个通用orm,就必须兼容主流的数据库,如果hibernate只能在某一个数据库上跑。那它肯定不会有目前的成就。

  结果这一点就变成了很多产品开发的基础,这些产品只需要关注自己的业务,不需要考虑在不同的数据库之间进行迁移了,一切底层都交给hibernate,只做好自己擅长的事情,花最少的时间获得最大的价值。

3.hibernate上面附着了一大堆的扩展,hibernate-validator可以做数据校验,hibernate-search可以玩全文检索,hibernate-shard可以做水平分表。

  随着不断的发展,hibernate俨然已经发展出一套产品线了,似乎我们只要选择了hibernate,就很容易获得上面说到得这些额外功能,那么到底是自己从头搞起比较爽呢?还是借助社区的力量比较容易呢?一般人还是会选择站在巨人的肩头的,如果所有人都喜欢自己玩,那开源社区也不会这么火了。

毫不脸红的夸完之后,下面是hibernate的问题:

1.封装严重,不容易理解底层实现,导致出现了问题不容易排查。

  这个确实无可奈何,它做的太复杂了,但是纵观orm系列,openjpa之类的jar包大小也是在2m左右,这也就说明orm本身是复杂的,选用orm就意味着要负担它的复杂性,如果不愿意付出学习成本,还是选用更简单的实现比较好。简单实现意味着无法满足上述的优点,正所谓鱼与熊掌不可兼得,大家要在实际选型过程中仔细权衡才行。

2.有些人认为hibernate效率极其低下,无法应付庞大数据量的操作。

  众所周知的情况是,系统的瓶颈往往会出现在数据库一端,因为我们可以搞20几台web服务器集群,但是加db server却不是那么容易的,一般都要经过水平分表才能实现这类需求。

  而对于这种特种应用,说是用hibernate完成关键环节显然是笑话,咱们也不用多说了,还是采用专用的技术去搞定。

  反过来,hibernate是否可以应对一般的应用呢?答案是肯定的,因为hibernate仅仅是在jdbc上进行的封装,只是自动处理了数据类型转换,并对每次操作都实现批量处理,相对一般的程序员来说, hibernate所实现的批量处理显然更高一些,与其让那些对数据库一知半解的人去写sql,反倒不如直接用hibernate还来的方便。


一家之言,万望各位指教
分享到:
评论
96 楼 skcmm 2011-03-18  
使用开源框架、从中学习人家的OO对象与数据库操作的思想,让程序员更多专注于业务 解决普遍性问题 才是初衷
95 楼 田耕信息技术 2011-02-28  
yawei 写道
elmar 写道
xyz20003 写道

外边随处可见的产品宣传“采用了hibernate,可以运行在目前所有的主流数据库上。”试想一下,如果自己开发一套基于数据库存储的产品,是选择自己实现兼容所有数据库呢?还是用hibernate?


我会选择只使用最标准的sql而不会用hibernate。

right. so you create severl util class to build sql query from pojo(or class, or whatever holds data) , it works well.

Then you find some databases have really nice feature you want to use, so you implements profiles for those databases.

After everything, you put your utils and db profiles into a jar and want to reuse it in your next project.

At this point, you realize this is just another F**KING ORM.

使用框架,能快速解决某方面的问题,但同时也给别方面造成更大的困难。它可能在这方面灵活了,但在别一方面却显得笨拙。在这方面开发有效率了,但在另一方面却是负担。
94 楼 田耕信息技术 2011-02-28  
yawei 写道
elmar 写道
xyz20003 写道

外边随处可见的产品宣传“采用了hibernate,可以运行在目前所有的主流数据库上。”试想一下,如果自己开发一套基于数据库存储的产品,是选择自己实现兼容所有数据库呢?还是用hibernate?


我会选择只使用最标准的sql而不会用hibernate。

right. so you create severl util class to build sql query from pojo(or class, or whatever holds data) , it works well.

Then you find some databases have really nice feature you want to use, so you implements profiles for those databases.

After everything, you put your utils and db profiles into a jar and want to reuse it in your next project.

At this point, you realize this is just another F**KING ORM.

没用过Habernate,只知道最基本的功能就是ORM。不过我个人喜欢用SQL语句来解决执行效率问题,而Habernate是解决开发效率问题,这两者还是有不小差异的。

另外,跨数据库的问题,在金融电信等领域,别说跨数据库,连数据库的版本号及其所在的LINUX主机环境都不敢动,一个小小的配置都可能导致灾难性的后果。所以说Habernate与跨数据库放在一起作为它的优点,这恐怕绝对不是原作者的本意,而是一些软件开发者宣传自己产品卖点的一种策略。实际应用中,大多数是些无关紧要的数据库才要考虑移植。

真正的跨数据库,我看还是多从标准SQL语句方面入手吧。
93 楼 yawei 2011-02-01  
elmar 写道
xyz20003 写道

外边随处可见的产品宣传“采用了hibernate,可以运行在目前所有的主流数据库上。”试想一下,如果自己开发一套基于数据库存储的产品,是选择自己实现兼容所有数据库呢?还是用hibernate?


我会选择只使用最标准的sql而不会用hibernate。

right. so you create severl util class to build sql query from pojo(or class, or whatever holds data) , it works well.

Then you find some databases have really nice feature you want to use, so you implements profiles for those databases.

After everything, you put your utils and db profiles into a jar and want to reuse it in your next project.

At this point, you realize this is just another F**KING ORM.
92 楼 elmar 2011-01-30  
xyz20003 写道

外边随处可见的产品宣传“采用了hibernate,可以运行在目前所有的主流数据库上。”试想一下,如果自己开发一套基于数据库存储的产品,是选择自己实现兼容所有数据库呢?还是用hibernate?


我会选择只使用最标准的sql而不会用hibernate。
91 楼 ppgunjack 2011-01-29  
跨数据库是种理想而已,经历的几个产品都做到了操作系统可移植,唯独数据库不能动
Hibernate要能算可靠的跨数据库方案,那jdbc都能算了,衡量可用性不是存取数据就完事了
企业用户关心的就是数据,至于oo,ssh,可移植客户关心吗?只有打单的乙方关心
开源的实现又不承担升级后对api的冲击和客户支持
企业应用还是商业db为王,商业中间件次之,然后是服务器厂商,看看几个最重要的开源现在都握在那些厂商手里,都是数据库厂商
与其强求dba学hibernate,不如要求程序员多学学数据库更合理。dba是管整个数据系统安危可靠,干嘛为了程序员的dao的选型又学java又学hibernate?
不要指望把扩缩依赖orm,应该更多考虑orm是否影响扩缩方案
90 楼 DOCDOC 2011-01-29  
ppgunjack 写道
adaikiss 写道
javazeke 写道
有多少项目大到要换数据库的,,,炒作炒作就好了嘛。。

如果你的项目是只卖给一个客户当然不需要, 但是如果你的产品是卖给不同用户的, 而你的用户又不愿意重新购买一个数据库......

大的项目别说换数据库,数据库版本都不会动,连着固定配置的主机和固定版本的OS一起打包
如果因为主机退市,带来的OS和主机升级会立项成立项目组专门进行移植和测试

现在系统自己实现了类似规则引擎的东西,问为啥不用jrule或者drools一类的成型的东西,曰,那时还没什么人用java
也找不到这些

企业级的产品,Linux这种背景尚且花了这么长时间,不要说其他的东西,如果用hibernate能降低很大成本的,说明原来成本本就不大

这要看情况了,如果你只是做个旧项目的outsource, 那自然不需要考虑跨数据库。
89 楼 ppgunjack 2011-01-28  
adaikiss 写道
javazeke 写道
有多少项目大到要换数据库的,,,炒作炒作就好了嘛。。

如果你的项目是只卖给一个客户当然不需要, 但是如果你的产品是卖给不同用户的, 而你的用户又不愿意重新购买一个数据库......

大的项目别说换数据库,数据库版本都不会动,连着固定配置的主机和固定版本的OS一起打包
如果因为主机退市,带来的OS和主机升级会立项成立项目组专门进行移植和测试

现在系统自己实现了类似规则引擎的东西,问为啥不用jrule或者drools一类的成型的东西,曰,那时还没什么人用java
也找不到这些

企业级的产品,Linux这种背景尚且花了这么长时间,不要说其他的东西,如果用hibernate能降低很大成本的,说明原来成本本就不大
88 楼 supben 2011-01-28  
哥们,你用了top
还想让hibernate帮你跨数据库?
87 楼 DOCDOC 2011-01-28  
adaikiss 写道
javazeke 写道
有多少项目大到要换数据库的,,,炒作炒作就好了嘛。。

如果你的项目是只卖给一个客户当然不需要, 但是如果你的产品是卖给不同用户的, 而你的用户又不愿意重新购买一个数据库......

如果基于自己的解决方案平台给客户做项目,多数据库的适应性还是非常非常重要的。
86 楼 adaikiss 2011-01-28  
javazeke 写道
有多少项目大到要换数据库的,,,炒作炒作就好了嘛。。

如果你的项目是只卖给一个客户当然不需要, 但是如果你的产品是卖给不同用户的, 而你的用户又不愿意重新购买一个数据库......
85 楼 woshihlp 2010-05-04  
学习了。。
心得:
做大项目,开发的团队大,用hibernate+反范式设计的数据库可从各方面保障开发效率,但是测试起来得谨慎了。。。
然后hibernate的多数据库支持,真换数据库了可不像说的那么轻松,要看做的功能用的HQL语句是不是大多不用改。。。
84 楼 ssuupv 2010-04-30  
aguai0 写道
哥们的头像挺有个性的

说我的吗?
83 楼 icewubin 2010-04-30  
ssuupv 写道
抛出异常的爱 写道
icewubin 写道
anky_end 写道
hibernate相对比较难以调试的地方就在于他的n+1

比如某个操作缓慢,要从满屏的sql中寻找出执行缓慢的sql不太轻松。

利用工具很容易打出每一句执行的时间。

别没事找事。。。。。
没毛病自找麻烦。
直接到plsql时去看运行效率。。。。


到plsql有时不准,同时一条语句,同样数据量,在生产环境中有时运行700-30000MS之间不等。差别相当的大。

生产环境会受OS和db的缓存的影响的。
82 楼 抛出异常的爱 2010-04-30  
ssuupv 写道
抛出异常的爱 写道
icewubin 写道
anky_end 写道
hibernate相对比较难以调试的地方就在于他的n+1

比如某个操作缓慢,要从满屏的sql中寻找出执行缓慢的sql不太轻松。

利用工具很容易打出每一句执行的时间。

别没事找事。。。。。
没毛病自找麻烦。
直接到plsql时去看运行效率。。。。


到plsql有时不准,同时一条语句,同样数据量,在生产环境中有时运行700-30000MS之间不等。差别相当的大。

plsql不准的话。。。。
loadrunner吧
个人认为loadrunner有点重。
81 楼 aguai0 2010-04-30  
哥们的头像挺有个性的
80 楼 ssuupv 2010-04-30  
HIB性能优化办法。其实跟JDBC性能优化办法。基本过程是
1.客户投诉慢
2.根据投诉慢功能点,查到性能问题代码点(其中这点蛮难的。我们一般都是客户说慢了,我们才去到指定代码跟踪。在开发环境不容易被发现)
3,针对问题点,如果是sql的语句。或者数据库一些设置问题。如果是数据库设置问题我想HIB跟JDBC区别不大吧,如果是sql语句。我想会HIB的人。基本上能控制HIB写的代码。转换出来的SQL是什么样,优化HIB代码也是比较容易的。所以HIB一般性能优化是没有问题。

其实HIB性能不好,还是不能直接调用数据库专属的。有些专属对环境对性能提升比较明显。

最后一点就是HIB表设计,跟JDBC表设计。宗旨是不一样的,有些地方是完全相背的。

79 楼 ssuupv 2010-04-30  
抛出异常的爱 写道
icewubin 写道
anky_end 写道
hibernate相对比较难以调试的地方就在于他的n+1

比如某个操作缓慢,要从满屏的sql中寻找出执行缓慢的sql不太轻松。

利用工具很容易打出每一句执行的时间。

别没事找事。。。。。
没毛病自找麻烦。
直接到plsql时去看运行效率。。。。


到plsql有时不准,同时一条语句,同样数据量,在生产环境中有时运行700-30000MS之间不等。差别相当的大。
78 楼 hjtracy1 2010-04-26  
个人认为java这种面向对象的高级语言纯粹使用jdbc不太现实。使用orm框架确实能加快开发速度,保证程序员有充足的时间处理业务逻辑而不是底层数据库代码的编写
77 楼 jasonshi 2010-04-22  
myreligion 写道
hibernate其实还有一个不足:对DBA不友好!


严重同意,这玩意简直是抢DBA的饭碗。

用了hibernate,大部分SQL都比较简单,偶尔有复杂的SQL,通常也比普通开发人员写的要好。
做性能优化,可以直接用jprofiler等工具在java端分析,偶尔拿个SQL在PLSQL Developer/TOAD中分析一下执行计划。
我们公司,用hibernate的项目,遇到性能优化都是开发人员顶上,而那些大量用PLSQL的项目,通常需要DBA全程参与优化

相关推荐

    hibernate需要的10个jar

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...

    hibernate第一个hibernate

    Hibernate是一个开源的Java库,它提供了一种在Java应用中持久化数据的方式,使得开发者无需编写大量的SQL语句,即可实现对数据库的CRUD(创建、读取、更新和删除)操作。它的核心理念是将面向对象的模型映射到传统...

    Hibernate、Spring和Struts工作原理及使用理由

    【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....

    菜鸟快速运行第一个hibernate

    标题“菜鸟快速运行第一个hibernate”表明了这是一个针对初学者的教程,旨在帮助他们快速上手并成功运行他们的第一个Hibernate项目。Hibernate是一个强大的Java ORM(对象关系映射)框架,它简化了数据库操作,使得...

    hibernate框架需要的jar

    7. ejb3-persistence.jar:包含Java Persistence API (JPA)的实现,尽管Hibernate有其自己的ORM机制,但有时也需要与JPA标准兼容,这个库提供了这种支持。 8. slf4j-api-1.5.8.jar:简单日志门面(SLF4J)是一个为...

    hibernate完整的一个项目

    **hibernate完整的一个项目** 本项目旨在提供一个完整的Hibernate框架的实现,涵盖了从环境搭建到实际应用的全过程。Hibernate是Java开发中的一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的...

    Hibernate 配置各种数据库

    Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...

    Hibernate需要的所有的jar包

    Hibernate是一个强大的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中处理数据库操作,而无需直接编写SQL语句。在这个“Hibernate需要的所有的jar包”中,包含了实现Hibernate功能所需的关键库。以下是...

    Hibernate完整使用教程

    传统的 JDBC 编程需要编写大量的代码来处理数据库交互,而 Hibernate 则提供了一种简洁的方式来访问关系数据库。 Hibernate 的主要优点是: * 简化了数据库交互的过程 * 提高了开发效率 * 提高了系统的可维护性 ...

    hibernate3必要jar包

    6. **第一级缓存和第二级缓存**:Hibernate内置了第一级缓存,每个Session都有自己的缓存;第二级缓存是可选的,可以跨Session共享,通常由缓存提供商如Ehcache提供。 7. **事务管理**:Hibernate支持JTA(Java ...

    hibernate注入的三种方式

    在探讨Hibernate注入的三种方式时,我们主要关注的是如何...这种方式不需要使用`LocalSessionFactoryBean`,而是直接在应用的配置文件中声明一个`SessionFactory` Bean,并将其注入到DAO类中。示例代码如下: ```xml ...

    Hibernate Hibernate5 讲义 PDF

    JPA、ORM和Hibernate之间的关系是:ORM是一种思想,JPA是这种思想的具体表现形式,即按照Java语法规范定义的一套标准接口,Hibernate则是这组接口的一个具体实现。 Hibernate框架的下载和配置也是Java开发人员必须...

    Hibernate,hibernate笔记

    在Hibernate映射文件(hbm.xml)中,如果指定了not-null属性为true,那么对应的JavaBean字段就必须有值,否则会引发这个异常。 2. **Hibernate配置**: `Hibernate.cfg.xml`文件是Hibernate的配置文件,包含了...

    Hibernate入门到精通

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

    HIbernate开发需要的包

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库

    Hibernate框架jia包

    Hibernate是一个开源的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的方式,通过将Java对象映射到数据库表,实现了对象和SQL的解耦,使得开发者可以更加专注于业务逻辑而不是繁琐的数据库操作。...

    hibernate4.3.11所需jar包

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射工具,使得开发者可以使用面向对象的方式来操作数据库,极大地简化了数据库操作。在Java应用中,尤其是在企业级应用开发中,Hibernate是...

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...

    hibernate显示不带?的完整sql

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数...

    Hibernate入门jar包

    这个jar包是使用Hibernate时必不可少的。 2. 数据库连接和驱动: - MySQL驱动:例如`mysql-connector-java.jar`,它是与MySQL数据库通信的桥梁,使得Hibernate能够通过JDBC(Java Database Connectivity)接口连接...

Global site tag (gtag.js) - Google Analytics