花钱的年华

--今天开始成为主站

用户操作
[即时聊天] [发私信] [加为好友]
江南白衣ID:calvinxiu
691237次访问,排名53好友0人,关注者38
calvinxiu的文章
原创 161 篇
翻译 0 篇
转载 0 篇
评论 646 篇
江南白衣的公告

肖桦,江南白衣,
开源项目SpringSide
春天的旁边
发起者

最近评论
calvinxiu:
发版本最痛苦的事情,就是刚发完之后忽然又有了一个比较重要的更新。

推荐大家下载3.0.3.1 (2mb)

1.简化了目录结构,感觉又清爽了不少。
2.消除了最后一块需要逐个Class写配置文件的地方(applicationContext.xml中的sessionFactory的mapping class)。
dreaming:恭喜~
hongyi:还是一头雾水,郁闷,为啥有这么多东东,叫人头大
suncheng_hong:用过appfuse,但springside还没有尝试过。
suncheng_hong:很想尝试一下。
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 ORM透明持久化方案面对的共同困境 收藏

      新一篇: Java下的框架编程(3)--关于反射的碎话 | 旧一篇: 在厨房,车顶,草地上使用Spring

      原文出处及评论:http://www.blogjava.net/calvin/archive/2006/01/05/26791.html

        作者:江南白衣    
       
         上次FB的吹水摘录:

           除JDBC外的数据访问技术包括EJB,Hibernate,JDO,iBatis等,但凡是ORM的总要面对相同的困境,如果透明持久化的,苦恼就更多 --Java数据访问技术依然在缓慢跨越鸿沟,.Net社区的同学用不着眼热心跳:

           1.查询语言--纷纷重回原来极想摆脱的sql,但实现得又不如SQL成熟。
              因为QueryObject,Criteria API的可读性太差,最后所有技术方案都回到它们原来一力想摆脱的SQL的路上。而且,因为是重新仓促设计,都不如sql 的成熟,总有很多做不到的地方。像刚开始的EJB QL,几乎什么都做不了,而hibernate 3.0 HQL把h2的代码抛弃了重新实现才达到相对满意的水平。

          2.积极载入和懒惰载入--不能如sql般每次随需定制
             ORM与jdbc访问的区别,就是以包含关联对象的对象,而不是以sql自由定制的ResultSet,作为数据载入的主体。

             积极载入策略在载入订单对象时,会接着载入顾客对象、产品对象,而如果产品对象又包含类别对象时.....整个数据库被拖了一小半出来。即使不玩连连看,clob对象的胡乱载入就够头痛了。

            与此对应的就是懒惰载入策略,比如EJB的初始版本,据闻每个属性查询一次数据库,数据库往返次数多得吓人。

            ORM方案会让用户自行定义这两种策略来达到平衡。一般默认采用积极载入,在一对多关联上定义lazy load,还有统一定义积极载入的层数。到了hibernate 3,更可以在列级别上定义lazy load。

            问题是,上述的定义都在hbm文件,每种对象的载入策略只能定义一次。而不能像jdbc那样,根据不同的情况select不同的结果列

            顺带一个问题是那些信息不完全对象,比如产品只有序号和名字,不带其他信息时,在一个纯面向对象环境里不好表示,hibernate提供的component方案也不是太好。

      3.透明持久化--对POJO的一些临时操作也会被持久化
           因为持久化是透明的,很容易就会误用,对POJO进行的一些临时操作,一不小心就被保存进数据库中。再加上Session,事务的混乱,远远没有用jdbc跑DML语句那么容易搞清楚发生的事情。

          而且,不是每个程序员都能习惯新的透明持久化环境,都对所用ORM系统的持久化策略理解深刻。何况这些策略以及整合它们的框架如Spring,还经常毫无提示的在升级时发生改动!!!

          所以,每个使用ORM的团队,在项目过程里总会有闹鬼的几天......

      发表于 @ 2006年01月10日 09:57:00|评论(loading...)|编辑

      新一篇: Java下的框架编程(3)--关于反射的碎话 | 旧一篇: 在厨房,车顶,草地上使用Spring

      评论

      #非典型秃子 发表于2006-01-10 15:41:00  IP: 61.152.132.*
      C++,也需要ORM啊!这确实是个讨厌的问题!
      #风沙 发表于2006-01-10 22:09:00  IP: 61.171.211.*
      业余跟专业的区别就在这
      http://www.odmg.org/
      #TN 发表于2006-01-10 19:42:00  IP: 202.77.139.*
      dotNet下的ORM类库很不错,试试ECO与XPO,效果很不错,可是不像hibernate 哪样是免费的.也可以试试MS的LINQ技术,非常好用.
      #charles 发表于2006-01-10 23:33:00  IP: 222.35.23.*
      >问题是,上述的定义都在hbm文件,每种对象的载入策略只
      >能定义一次。而不能像jdbc那样,根据不同的情况select不
      >同的结果列。

      你只是懂hibernate而已。JDO/TOPLink都可以提供灵活的加载方式(Fetch plan),对多一个POJO的加载方式可以根据页面显示的需要进行定义。EJB3 SQL中的 fetch join 也可以让用户根据需要去加载需要的关联表。



      #白衣 发表于2006-01-12 10:11:00  IP: 219.136.159.*
      @charles
      JDO/TOPLink的fetch plan我先去学习一下.EJB SQL的fecth不算啊,又走回sql手工定义选择列而已.

      不过为什么fetch plan 进不了EJB3呢?还是进了我不知道?
      #肥豆 发表于2006-01-11 10:42:00  IP: 210.22.89.*
      现在所有的ORM,其实都是试图从O一方来解决问题,所以搞的很累,为什么不试图从M一方来解决了,如果数据库能直接提供对象,那不就不用这么穷折腾了吗! :)
      #肥豆 发表于2006-01-11 11:28:00  IP: 222.66.56.*
      Cache数据库就是能在后台写对象,并支持现在几乎所有的主流前台编程语言,而且全面兼容Sql92标准! 是个好东西
      #charles 发表于2006-01-16 14:34:00  IP: 222.35.23.*
      >EJB SQL的fecth不算啊,又走回sql手工定义选择列而已.
      因为ejb3专家组的某专家认为用sql + fetch join就足够好了。
      #k.o. 发表于2006-01-30 10:24:00  IP: 202.232.65.*
      也许我已经太落后于时代了,我总觉得用什么ORM的工具都不如直接用SQL文来的方便。最多,也就是把ResultSet->Object这一块做成共通的。
      原因是:
      1.我们(指我和周围的一些人)考虑实现逻辑的时候,直接的想法就是根据什么条件取得什么数据,表和表怎么关联,表和表之间的关系是1:1还是1:n,要不要外关联等等。
      本来就是R的东西,怎么转换成O来思考,请指教。
      2.如果1是被认可的方式,那么这种思维的转换会增加复杂度;并且,写出来的东西不像SQL文那样可以直接在可执行SQL的Tool里面验证是否正确。至于Hibernate的Cache什么的,比如需要考虑防止多人同时更新的问题,很是让人头疼。
      3.从群众基础的方面来考虑。很多ORM工具的宣传上说,可以让程序员摆脱DB操作,把精力放到业务逻辑上来。在我看来,不管是目前的工具还不尽如人意也好,还是数据库操作本来就是业务逻辑的一部分也好,这个目的都远远没有实现。我看到的大部分程序员,都谈不上是技术的狂热爱好者,也不是什么接受能力很强的牛人,让他们从头来学习一门几乎全新的技术,时间和经济成本都很大。这样的话,本来用ORM是想省事的,结果往往省不了事。现在版本更新这么快,Hibernate2学到的东西,居然出了Hibernate3还要再学习一遍:(相对来说,SQL是稳定的。从PM的角度来说,谁愿意冒这个风险,为了将来可能的生产力提高?
      总结以上的,我不是说ORM不好,只是现实中往往有很多其他的东西需要一起考虑。
      扯点题外话,我们费了老大的力气,搞定了Hibernate,最终客户却什么感觉也没有(也许bug率还会上升),是不是有点孤芳自赏的感觉?
      所以,如果可以选择的话,我更愿意把精力投到ajax这样的,客户可以直接体会到差别的技术上来。
      大家说呢?

      #J++ 发表于2006-02-10 08:57:00  IP: 222.90.70.*
      文章写的毫无意义
      因为你只是固执的站在SQL人员的角度看待问题本身,而这些持久层的目的不是如此,况且持久层的选择与你是否继续使用SQL毫无关系,关键在于你的项目本身的类别,对于OLAP的类别根本不适合Hibernate这样的持久层框架的,况且Hibernate本身支持NATIVE SQL的形式!
      所以,不要动不动就否定某个事物,而是要看到出现这个事物的目的是什么?!
      #JAVA++ 发表于2006-02-12 22:40:00  IP: 219.134.244.*
      ORM确实有我问题,是数据库外部O到数据库内部的R有问题,要是做到数据库外部的O和数据库内部的O直接对话就可以,只要有面向对象的数据库+面向对象的SQL问题就都解决了,不用这么麻烦,还要做PO层,VO层转换来转换去的,人民内部问题,为什么要分开解决中间搭桥梁.
      #肥豆 发表于2006-02-16 11:12:00  IP: 210.22.89.*
      赞同JAVA++ 的说法! 之所以会出现所谓的O/R Mapping的问题,就在于面向对象的编程语言和面向关系的数据库的之间的这个现实的矛盾,国内言数据库就是sql,oracle,sybase,db2 仿佛除了这些其他的都不是数据库一样,思想太局限了,死死的盯在关系型的数据库上面,还津津乐道。国外的对象数据库都弄的很不错了,都有段发展历史了,很多项目中oracle,db2都不是的可选的产品,因为无法满足系统的需求和要求! 这也就是差距的所在啊。
      #肥豆 发表于2006-02-16 11:17:00  IP: 222.66.56.*
      数据库里能直接提供对象,那ORM还有存在的理由吗? :).当然Sql语言还是有存在的必要的,至少在新的数据查询语言出来之前,它还是有存在的价值的,在数据查询和挖掘方面(OLAP)它还是有用处的。但在业务处理方面(OLTP)的作用会被更好的对象方式替代掉了。
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣