ORM如何用才不是滥用

news/2024/7/4 10:11:11

ORM如何用才不是滥用

因为web 应用每一次处理都要响应一个数据库操作,添加,修改,或者删除,所以关联集合对象的取出不是必要的

ORM自动取出对象,自动发现变化,自动保存也许只有在桌面程序或者有状态的web应用,例如jsf中才有意义,而且必须不是open session in view模式.否则操作中会存在大量的取出对象,修改对象,然后再保存回去的操作。

所以为了让每一次click中db操作最少,必须对DAO进行细力度的封装

以petstore中order对象的装载为例,其中要用到一个lineitems的集合

  public Order getOrder(int orderId) {
    Order order = null;
    Object parameterObject = new Integer(orderId);
    order = (Order) queryForObject("getOrder", parameterObject);
    order.setLineItems(queryForList("getLineItemsByOrderId", new Integer(order.getOrderId())));
    return order;
  }

在DAO里面,把关联分成两步来填充。

对于一个完全domain设计的系统中,对象的集合属性的对象中可能存在大量的级联的关联

完全用lazy load不是一个好方法,无论从代码上,还是从性能上。

所以可以说ORM在设计之出就没有给出一个对于orm自身的设计模式的说明

例如Order->LineItem->Item->Product->Category->ParentCategory,

这样我持久一个order,该需要多少个操作呢

尤其在web这种stateless的环境中

 

对于一个最简单的student-sc-class,三张表,如果要把一个学生和一门课关联起来,只要在DAO里面,SetStuClass(stu_id,cls_id)就可以了,如果用ORM来做,s需要先load一个student对象,然后stu.addClass(class),然后session.save(stu),这样还真是kinda weird

=======


所以对于orm操作模式化这个问题,首先要把写和读操作分开来看

对于读:也就是查询,
如果结果仅仅是某个对象,且附属表的信息可以作为该对象的集合
例如employee-1:n-employeecontract,可以采用ORM或者DAO,甚至ORM在这里更方便

如果结果需要的字段跨多个表,结果集可以用map来存放
例如 unit-1:n-employeecontract-n:1-employee ,现在要显示某单位所有的employeecontract为一个列表,那么可能三个表各需要几个字段,此时就不应该使用ORM,而用List来存放

对于写:
例如在employee-1:n-employeecontract中保存一张employeecontract,完全没必要使用employee的集合来保存,但是如果一旦定义了employee和employeecontract,这里就必须使用ORM来保存,否则employeecontract就是一个emptylist,所以,上面的第一条还是应该使用DAO来保存


所以,以上就说明了一点,在必须有pojo这样domain object的实际应用中,ORM并不可行,细力度的DAO才是一个更好的方案,但是我们还需要一个工具,能将pojo中需要的元素自动映射到表里面

当然,hibernate可以做这样的工具,不过要吧字段以xml或annotation的方式声明出来,ibatis也可以做,不过映射文件也太过于复杂了

其实只是需要一个像php的adodb这样的工具,不过必须使用对象,主要是处理对象变量填充和变量类型转换,而这两个过程在php中是不需要的

 

反正hibernate是肯定要用的,关键是怎么用才不是滥用


hibernate3也对SQL有很好的支持支持
sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();

sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

所以hibernate最佳实践可以归结为:

更新还是以表为单位手动更新,读也是以表或视图为单位,对于关联的集合,手动加载 





http://www.niftyadmin.cn/n/3654364.html

相关文章

用flatworm解析和生成Flat Files开发指南

用flatworm解析和生成Flat Files开发指南 For Version 2.0 Last Revised December, 2009 Flat files. Much as we live in an XML/SOAP/Web Services world, theres still a ton of data being moved around between proprietary and legacy applications that consists of …

Java技术随想

CSDN英雄大会召开前之随想早春三月,江南大地虽然还是处于春捂时节,但万物复苏的清新感觉还是扑面而来.承蒙各位支持我的好友的投票,我在CSDN的MVB票选中获得了第二名,在即将到来的四月份,我荣幸的受CSDN的邀请参加其组织的英雄会.这是对我去年一年坚持写博的一份肯定和鼓励.从事…

创维推出基于RFID的“云电视”

即将在下月大量上市的创维“云电视”,将通过运用“成都造”RFID(射频识别)技术,在全球首开家电行业的电子保单时代……8日,从成都武侯区获悉,落户该区的台湾晨星半导体旗下全资子公司成都美实达信息技术有限…

开始使用SmartDraw绘制开发中的各种图形

1 对于不需要将UML生成代码,或者反向生成UML的项目,没有必要使用标准的UML工具构建完整的UML模型来画图,SmartDraw其实只是一个矢量图工具,所以很多地方想怎么画怎么画,例如名字可以用中文,一些不重要的函数…

合肥旅游卡”月底有望面市

近日,合肥市旅游协会通过市旅游局官网发布了一则通知,征集自愿参与“游中国合肥旅游卡”的旅游企业,如果此次征集能够得到合肥旅游企业的广泛响应,首个“游中国合肥旅游卡”将在合肥正式发行。计划发行的“游中国合肥旅游卡”既是…

海科融通拟推金融IC卡互联网终端

北京海科融通信息技术有限公司有关负责人日前表示,在银行卡从磁条向金融IC卡迁移的形势下,该公司积极参与中国银联组织的金融IC卡互联网支付终端的行业规范和标准的起草和编写,完成了符合PBOC2.0标准的金融IC卡互联网终端产品的研发和生产&am…

Mule - 企业服务总线

一提到总线,一般学计算机专业的往往会联想到两样东西,一是网络拓扑上的总线结构,二是电脑主板上的总线。和他们不同的是,企业服务总线是一种软件总线,但是他们都可以进行一定的类比。类比是快速学习最好的方法之一。网…

国家旅游局发布导游IC卡管理办法

国家旅游局去年的发布《关于印发导游IC卡发放管理办法(试行)》的通知,通知强调,自2011年1月1日起,由各省、自治区、直辖市和新疆生产建设兵团旅游局(委)(以下简称“省级旅游局”&…