`
firebody
  • 浏览: 40757 次
  • 性别: Icon_minigender_1
社区版块
存档分类

谈谈应用ORM框架针对遗留数据库做模型设计的一些技巧。

阅读更多
很多项目的开发都是基于已有数据库做开发的。遗留数据库的存在增加了java模型和数据模型之间的障碍。
很多朋友为此是否选择hibernate或者别的Jdbc wrapper的开发框架而犹豫不决。

其实,用hibernate类似的orm工具总归是明智的选择,当然不是唯一的明智的选择,我写这篇文章只是希望能够给那些还在犹豫不决的人提供一些自信的力量,可以果断的作出自己的决定。

有一个朋友询问过针对遗留系统做模型设计的问题 。很难简单回答这个问题,但是我可以提供我的一些经验,同时也把这篇帖子作为对那位朋友的一个完整的回答,希望能顾对他有所帮助。


针对统一的业务逻辑,对 业务模型,DAO/Service 分别设计精巧的的继承体系
          很多朋友对此抱很谨慎的态度,因为他们觉得遗留系统很难有效支持业务模型的继承体系。
          他们的担心是有理的,而且通常情况下,遗留系统确实无法支持现有ORM的类继承体系。然而,遗留系统不支持,并不能阻碍我们在业务模型畅通无阻的使用类继承,达到DRY的目标。抽取出的抽象模型可以更容易实现DRY,同时这里面的业务模型的层次设计很多时候也是真正反映了“业务统一处理”的需求。
          这样的设计出现了很有意思的一个局面,业务模型是继承体系的模型,而数据模型是一对一映射的表模型,当用这种设计来处理业务的时候,特别是在处理“统一的抽象的业务逻辑”的时候,比支持继承模型的表模型 付出更多的一些努力才能达到,很多朋友一直担心这个“多付出”的努力是否会很可怕。 真的不用担心,并没有付出多少努力,你只需要在 DAO或者你的Service模块里面,做针对性的继承性的设计。通过这个合理的继承体系的DAO/Service模块,我们就可以在里面减少甚至完美弥补 因为 表模型不支持继承体系的业务模型带来的问题。

          一般来说,DAO/Service最好有这样的层次:

BaseService<----UserService,OrderService

class BaseService { update,create,delete,findById..} 


保证各个子类最终的CRUD都是通过 baseService.CRUD来完成 。

这样的DAO/Service类层次设计,为我们设计的业务模型的继承体系带来了“用武之地” ,在baseService的这个地方,大家可以把一些“需要统一处理的”业务逻辑放在此来做,比较有代表性的一点是 :

class abstract BaseService extends HibernateDAOSupport {

     public void create(Object o){
                 if(o instanceof PublishableModel){
                           publish((PublishableModel)o);
                  }
                 getHibernateTemplate().save(o);
    }

}

似乎很别扭但却很有“意义”的一段代码,PublishableModel这个抽象类代表了业务模型中某个可以统一处理的业务抽象模型,而 这段代码:
   if(o instanceof PublishableModel){
                           publish((PublishableModel)o);
                  }
 

给了这个业务模型抽象体系以真正发挥作用的“用武之地” 。


作为有经验的 开发人员,无论何时何地,都应该始终不渝的坚持并且贯彻“DRY”的宗旨。




分享到:
评论
7 楼 sslaowan 2008-04-12  
BaseService extends HibernateDAOSupport?Service缘何继承自DAO?
6 楼 downpour 2007-12-31  
我也经常会为了少写一些代码而使用继承,而不是用工具类,这样会在心里上有一种更直观的感觉,呵呵。

目前ORM应该可以适用于多数的遗留系统,将Service,DAO进行严格的区分,并合理设计层次,ORM能够发挥其很大的功效。不过有些遗留系统,有10w行以上的Store Procedure,这些Procedure经过长时间的考验和测试,包含了大量的逻辑,此时我们会采用比较plain的JDBC方案来处理,尽量不去破坏这些逻辑完整的Procedure。此时,可能就需要自己手工去做一些ORM的工作,而不采用比较popular的ORM工具。
5 楼 nihongye 2007-12-30  
firebody 写道
nihongye 写道
单从上面那段示意性代码来说,子类还需要调用create()这个方法,所以可以将这个方法提取为一个工具类去啊。

用继承比工具类更来得自然一些。

即使子类不调用 create() ,也要写这么长长的一行代码吧:

getHibernateTemplate().save(o) ;


用一个 create(o) 来替代这么一行代码,我想很多人都是乐意的吧。

为了让一个长句变成一个短句(相当于别名法)而使用继承,绝对没必要。
但是你的主要观点service的继承体系,当然是赞同,呵呵。我觉得几十种模式该上的上,为了dry,但是技巧用多,用错的问题很让人头痛,该怎样抽象,有什么好的原则,觉得好难把握。
我觉得关键的一点,业务代码的组织跟数据的表示形式是完全分离的,无论数据是二维表还是对象,所以遗留系统也可以使用orm,也可以构造出相对比较好维护的业务处理代码来。
4 楼 firebody 2007-12-30  
nihongye 写道
单从上面那段示意性代码来说,子类还需要调用create()这个方法,所以可以将这个方法提取为一个工具类去啊。

用继承比工具类更来得自然一些。

即使子类不调用 create() ,也要写这么长长的一行代码吧:

getHibernateTemplate().save(o) ;


用一个 create(o) 来替代这么一行代码,我想很多人都是乐意的吧。
3 楼 nihongye 2007-12-30  
单从上面那段示意性代码来说,子类还需要调用create()这个方法,所以可以将这个方法提取为一个工具类去啊。
2 楼 firebody 2007-12-30  
nihongye 写道
引用
   1. class abstract BaseService extends HibernateDAOSupport { 
   2.  
   3.      public void create(Object o){ 
   4.                  if(o instanceof PublishableModel){ 
   5.                            publish((PublishableModel)o); 
   6.                   } 
   7.                  getHibernateTemplate().save(o); 
   8.     } 
   9.  
  10. } 

如果按照关联优先于继承的原则,上面代码显示出了优先使用继承的坏味道。:)


举个例子,比如遗留系统中的很多表都有一个 create_user,create_time两个字段,表示这个记录的创建者和创建时间 。 创建者表示 登录系统的用户 。

有很多种方式可以统一做这块的处理。 但是一个针对这个业务的继承还是很自然而然的出来了 :

abstract Class BaseEntity{
       User create_user;
       Date create_time
       

}

然后做统一处理的方式就很多了,比如我上面写的“蹩脚”的代码,也有的可能想到用拦截器的方式来做。
无所谓,可能后一种好一些,但是达到“统一有一个地方来处理相似的逻辑”这个目的(DRY)就行了,至于怎么达到,其实可以不用计较了。


我想说的就是类似这样的情况,不知道你说的“关联优先于继承”的观点从何而来? 呵呵
1 楼 nihongye 2007-12-30  
引用
   1. class abstract BaseService extends HibernateDAOSupport { 
   2.  
   3.      public void create(Object o){ 
   4.                  if(o instanceof PublishableModel){ 
   5.                            publish((PublishableModel)o); 
   6.                   } 
   7.                  getHibernateTemplate().save(o); 
   8.     } 
   9.  
  10. } 

如果按照关联优先于继承的原则,上面代码显示出了优先使用继承的坏味道。:)

相关推荐

    ORM(关系型数据库与对象映射项目)

    2. **模型设计**:在对象模型设计阶段,需要定义与数据库表对应的实体类,包括类的属性(对应数据库字段)和行为(对应业务逻辑)。此外,还需要定义实体间的关系,如一对一、一对多、多对多等,这些关系会映射到...

    ORM框架ORM框架ORM框架ORM框架

    ORM(Object-Relational Mapping,对象关系映射)框架是一种软件技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。ORM框架的主要目标是简化...

    基于NET6.0 ORM 框架 支持多种数据库 SqlServer Oracle MySql PostgreSql Sqlite

    10. **设计模式应用**: ORM框架通常会遵循一些设计模式,如工厂模式用于创建数据库连接,代理模式用于实现懒加载等,这有助于保持代码的整洁和模块化。 在Fast.Framework_master.zip这个压缩包中,可能包含了该ORM...

    Java自定义的类似ORM的数据库操作框架

    Java自定义的类似ORM的数据库操作框架是一种高效且灵活的数据访问解决方案,...通过阅读和理解这些代码,开发者可以更好地了解如何设计和实现一个自定义的ORM框架,并将其应用到实际项目中,提升开发效率和代码质量。

    sqlite3的ORM框架

    SQLite3的ORM(Object-Relational Mapping)框架是一种在C++编程中将数据库关系模型与对象模型进行对应的技术。ORM框架使得开发者可以使用面向对象的方式来操作数据库,避免了直接编写SQL语句,提高了开发效率和代码...

    Python 进阶(三):Python使用ORM框架SQLAlchemy操作Oracle数据库

    本文主要介绍Python使用ORM框架SQLAlchemy操作Oracle数据库。 1. 安装Oracle Instant Client 2. 安装依赖库 使用以下命令来安装SQLAlchemy和cx_Oracle库: pip install SQLAlchemy pip install cx_Oracle 3.创建...

    国内最受欢迎的ORM框架,支持.NET CORE 和四种数据库,具有EF NH的功能

    ORM(Object-Relational Mapping,对象关系映射)框架是.NET开发者在处理数据库操作时常用的一种工具,它能够将数据库中的数据与程序中的对象进行映射,使得开发者可以使用面向对象的方式来操作数据库,而无需关心...

    基于ORM的数据库框架Room

    **基于ORM的数据库框架Room** 在Android开发中,数据存储是一个关键部分,而Room数据库框架是Google官方推荐的用于Android应用程序的数据持久化解决方案。Room基于对象关系映射(ORM)理念,它允许开发者以更面向...

    简单高效的ORM框架

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据模型映射到面向对象的编程语言中。在现代软件开发中,ORM框架扮演着重要的角色,它使得开发者无需关注底层SQL语句,就...

    轻量级Net的ORM框架

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据模型映射到面向对象的软件应用中。在.NET环境中,ORM框架可以帮助开发者简化数据库操作,使得开发者可以使用面向对象...

    巧用工具封装属于自己的ORM框架【XutilsDbUtil】分装

    总的来说,封装一个ORM框架需要对数据库操作有深入的理解,同时也需要熟悉面向对象的设计原则。通过这样的封装,可以提高代码的可读性和可维护性,降低数据库操作的复杂度,让开发者能更专注于业务逻辑的实现。

    Spring数据库访问之ORM(三)

    在Spring框架中,数据库访问是核心功能之一,而ORM(对象关系映射)技术则是连接业务逻辑和数据存储的关键桥梁。本篇文章将深入探讨Spring如何实现ORM,主要以JPA(Java Persistence API)和Hibernate为例,同时也会...

    ORM框架实例代码

    ORM(Object-Relational Mapping,对象关系映射)框架是一种编程技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来操作数据库,而无需关注底层的SQL语句。它降低了数据访问层的复杂性...

    基于ORM模型的物资管理系统的设计和实现

    本文将深入探讨如何利用ORM模型设计并实现一个高效、便捷的物资管理系统。 ORM,即对象关系映射,是一种编程技术,它将数据库的表结构映射为程序中的对象,使得开发者可以使用面向对象的方式来操作数据库,降低了...

    基于java 简易ORM 框架实现(二)

    ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,而无需直接编写SQL语句,极大地提高了开发效率和代码可维护性。 首先,ORM框架的核心思想是将数据库表与Java类进行映射,表中的每一...

    自制ORM框架源代码

    在Java开发领域,ORM(Object-Relational Mapping)框架是连接数据库和对象模型的重要工具,它可以将数据库操作转化为面向对象的编程方式,简化了数据库的使用。本项目是一个基于JDK 6.0的自定义ORM框架,旨在通过...

    ASP.NET 自已封装的ORM 框架版本2

    要使用这个ORM框架,开发者需要了解其API设计,包括如何创建数据库连接,如何定义数据模型,如何执行查询,以及如何进行数据的CRUD(Create, Read, Update, Delete)操作。此外,对于多表查询和分页,还需要学习如何...

    Android SQLite ORM框架

    一个简单的Android SQLite ORM框架不想花资源分的同学可以上我的github主页下载:https://github.com/chenyihan/Simple-SQLite-ORM-Android,因为要传到github,所以代码中的注释和doc文档都是英文的,对自己英文不...

    chloe orm 数据库框架

    封装了oracle mysql sqllite sqlserver等数据库框架,采用了ORM框架模式。使用起来简单,易用,可以去官方网站查看具体的API

Global site tag (gtag.js) - Google Analytics