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

老题:Java 如此 ActiveRecord 可行否?

阅读更多
Java在web应用方面,是否有如下的开发模式的可能(直接在Action写如下代码)?

1、User user = ActiveRecord.insert(User.class, "logonName=root;desc='value with blank chars';");
2、user.setDesc("some desc for the new user");
3、ActiveRecord.insert(user);
4、ActiveRecord.update(user);
5、ActiveRecord.delete(user);
6、ActiveRecord.get(user, "7777");//get by id
7、ActiveRecord.load(user, "8888");//load by id
8、ActiveRecord.load(User.class, "9999");//return a unique result
9、ActiveRecord.findEq(User.class, "logonName", "root");
10、ActiveRecord.findLe(User.class, "logonName","root");
11、ActiveRecord.find(User.class, "age>20 and age<22");// return list
12、ActiveRecord.get(User.class, "path='best_guy'");//return a unique result
13、ActiveRecord.find(User.class, "age>? and age<?", 2, 5);// return list
14、ActiveRecord.get(User.class, "path='best_guy'"); //return a unique result
15、String hql1 = "from User u inner join u.department d where d=?";
16、ActiveRecord.find(hql1, 1);// return list
17、String hql2 = "from User u inner join u.department d where d=? and u.role=?";
18、ActiveRecord.get(hql2, 1, "manager");//return a unique result


其中
0)、ActiveRecord由独立项目的其它公共组件项目提供
1)、ActiveRecord提供静态方法,ActiveRecord底层采用Hibernate API实现CRUD,支持JPA语义
2)、ActiveRecord通过某种方式自动寻获Spring Web AppContext下的Hibernate SessionFactory
3)、实体类使用jpa的annotation采用@Entity标注,以减少开发代码量(code=java,xml,...)
4)、ActiveRecord能够自动识别从事先指定package,判断哪些类加注了@Entity。比如com.xxx.domain,并通知给Hibernate
5)、ActiveRecord在Web Action中被使用,去掉Bo、Dao层,需要事务时,考虑直接把事务架到Action方法上

早先很多人习惯使用static的方法(函数)来编程,当时这种方法给人的感觉是“不专业”
但是现在反过来看看,是否在很多应用上(特别是web应用方面),这样的方式方式是否更方便?

因为JPA/Hibernatge的承诺,领域逻辑就可以直接在Domain类完成了
(Domain类可以根据ref navigation、ActiveRecord 2种方式获取想要的对象)。



分享到:
评论
13 楼 murainwood 2008-08-16  
对于测试来说太重了。
12 楼 venus224 2008-08-16  
可以单元测试?
11 楼 ajoo 2008-01-20  
就是说,只做集成测试?没有单元测试?
10 楼 VonNeumann 2008-01-20  
这种做法挺像db4o的
也许真正的充血模型的实现依靠对象数据库来实现
9 楼 Norther 2008-01-20  
全部是靠静态方法获得对象,这个操作如何MOCK?如可单元测试?
8 楼 VonNeumann 2008-01-20  
这种做法挺像db4o的
也许真正的充血模型的实现依靠对象数据库来实现
7 楼 Godlikeme 2007-12-23  
如果应用系统可以完全屏蔽数据库,只要操作领域对象,且业务逻辑简单到如此地步,不考虑事务隔离级别,不考虑事务控制、不考虑多线程并发、不考虑批量数据提交、不考虑异步操作,不考虑权限,不考虑业务异常...,也就无所谓什么方式了。还真不如换了rails...
6 楼 Arden 2007-12-21  
直接Grails吧。
5 楼 aninfeel 2007-12-21  
都成动态语言了
4 楼 wangyonghe 2007-12-21  
这要从系统规模的大小来决定, 如果一个系统中只有几个或十几个模型, 那么用ActiveRecord 模式还是不错的方案, 但是如果一个系统中有成百或成千个模型,那么就应该用Manager 模式来代替了,这样我们可以做一个抽象的CRUD或查询接口,它可以接受所有模型,这样就不需要在每个模型的写查询或更新代码了.
有人会说可以通过继承的方式来实现呀,不要忘了Java 中只能继承一个类,如果模型本身就用继承关系,这样查询的代码就很难通过继承来实现了.
3 楼 downpour 2007-12-12  
关键不在于写在哪里,而在于你的查询方式。提供同样的接口,写在DAO和写在ActiveRecord里面是一样的。
2 楼 Qieqie 2007-12-12  
因为大部分一个JVM(注1)下的应用使用的只是一个数据库,
所以我考虑可以做成,外部程序通过某种方式(e.g Spring xml)提供一个DataSource对象,告诉ActiveRecored如何寻获这个DataSource后,
然后自己构建SessionFactory(这个构建过程,ActiveRecord类要能够自动识别那些实体是Entity,而不需要人工配置告知)。

User类具有CRUD方法的
User.findOne("name = ? and age = ?", l); 

倒是可以做一个ActiveRecordEntity,作为User的基类,由ActiveRecordEntity调用AcitveRecord的方法。


还有,因为Hibernate提供了Criteria这种方式,可以在ActiveRecord增加一系列这样的方法,作为HQL的一种替代:
ActiveRecord.find(Criterion... criterion)


-----------------------------
我自己在开发dao时使用一个这样类作为DAO的基类:GenericHibernateDao<T> extends Spring的HibernateDaoSupport(注2),DAO开发上已经很方便了,但是每个实体类都要有一个对应的UserDao extends GenericHibernateDao<User>,我们可以把它思想般到ActiveRecord类中

上面的ActiveRecord约=Spring的DaoSupport/Template,但是,
前者提供的方法是函数式的,并能够自动寻找DataSource,自动识别哪些是Entity,并构建出合适的SessionFactory,可在程序中直接使用。
后者,需要“注入”,这导致在Domain类中无法轻松用到这些CRUD,以致无法在Domain中进行需要数据库连接的业务运算。

如果能如此,在很多简单的场合就可以轻松开发了?


注1:JVM这样的表述不是很准确:一个WebContaner只有一个JVM,但是各自具体的web app同样类名的类,却是互相区别的。
注2:我这里的GenericHibernateDao类似http://www.hibernate.org/328.html说的,只是我自己加了Spring的HibernateDaoSupport,以更方便。



1 楼 QuakeWang 2007-12-12  
在2002~2004年中间,我们使用OFBiz的entity engine,作了一些简化,采用map和list作为generic parameter container,调用api和你设想的很类似:
user = User.find(1);
user.update("name", "foo");

Map m = new HashMap();
m.put("name", "bar");
m.put("age", 30);
user.update(m);

List l = new ArrayList();
l.add("bar");
l.add(30);
user = User.findOne("name = ? and age = ?", l);
users = User.findAll("name = ? and age = ?", l);


这里的map和list组装在beanshell的帮助下,语法会变得很简单,也可以利用页面元素和属性同名的特点,直接调用request的parameter map:
user.update(parameters);


这种方法经过多个项目的实践,效果还不错,最大缺点就是失去了Java编译期检查的优势,比如find语句里面的拼写错误,再比如属性名的重构。

在05年以后,我们逐渐采用Hibernate,稍微进行一些包装,也完全能够实现上面的用法,但是CRUD操作并不是我们项目中占很大比重的代码,所以后续的项目只是简单地调用spring包装好的api。

相关推荐

    activerecord-view:带有 ActiveRecord 的 SQL 视图

    活动记录::查看 集成 ActiveRecord 以方便在迁移中轻松使用视图。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord-view' 然后执行: $ bundle或者自己安装: $ gem install activerecord-view用法要在...

    to_xls-rails:将Rails ActiveRecord或Mongid数据导出到Excel文件

    数组元素支持对象:ActiveRecord,Mongid,哈希。 在您的Gemfile中: gem 'to_xls-rails' # Last officially released gem # gem "to_xls-rails", :git =&gt; "git://github....

    Java敏捷持久层-ROR-ActiveRecord持久层框架的Java实现

    ROR-ActiveRecord持久层框架的Java实现

    ROR绿色最新环境(2013/3/10)

    ActiveRecord::ConnectionAdapters::ConnectionManagement ActiveRecord::QueryCache ActionDispatch::Cookies ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ...

    bulk_insert:带有ActiveRecord的高效批量插入

    ActiveRecord扩展名,用于帮助在单个insert语句中插入很多行。 安装 将其添加到您的Gemfile中: gem 'bulk_insert' 用法 BulkInsert向您的ActiveRecord模型添加了新的类方法: class Book &lt; ActiveRecord :: ...

    crypt_keeper:透明的ActiveRecord加密

    地穴守护者为ActiveRecord提供透明的加密。 它与加密无关。 您可以使用所需的任何加密算法来保护数据。 您需要做的是一个简单的类,它可以完成3件事。 采用哈希参数进行initialize 提供返回加密字符串的encrypt方法...

    i18n-active_record:I18n ActiveRecord后端

    I18n ::后端:: ActiveRecord 该存储库包含I18n ActiveRecord后端和从提取的支持代码。... ActiveRecord::Migration def self.up create_table :translations do |t| t.string :locale t.string :key

    wp-activerecord:WordPress 的 ActiveRecord 实现

    WordPress ActiveRecord WordPress ActiveRecord 实现了可以轻松地检索、更新和删除数据库表的行,而无需费力处理原始 SQL 查询字符串。 这个库的目标是为 CMS WordPress 提供一个小而强大的 ,它应该很容易实现。 ...

    php-activerecord:PHP的ActiveRecord实现

    什么是ActiveRecord的简要概述: 活动记录是一种访问数据库中数据的方法。 数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的一行。 创建对象后,保存后会将新行添加到表中。 任何加载的对象都从数据库...

    Castle.ActiveRecord 升级NHibernate到3.4.0GA

    Castle.ActiveRecord官方已经停止更新了,官方最高支持到NHibernate 3.1.0.4000,这个版本还有不少问题(例如:[NH-2213] - CLONE -Wrong parameters order in IQuery with SetParameterList and Filter)。...

    lazy_find:简化了ActiveRecord中的first,last,take方法

    Simplified the first,last,take methods in ActiveRecord.So instead of using where and first, you can directly use first. 安装 将此行添加到您的应用程序的Gemfile中: gem 'lazy_find' 然后执行: $ ...

    Castle ActiveRecord学习实践

    CASTLE ACTIVERECORD学习实践(1):快速入门指南 CASTLE ACTIVERECORD学习实践(2):构建配置信息 CASTLE ACTIVERECORD学习实践(3):映射基础 CASTLE ACTIVERECORD学习实践(4):实现ONE-MANY关系的映射 CASTLE...

    activerecord-mysql-uuid-column:ActiveRecord MySQL 适配器的真实 UUID 列

    ActiveRecord::Mysql::UuidColumn 向ActiveRecord MySQL2适配器添加一个:uuid列,该列存储在一个16字节的二进制列中。 这正是它需要的空间。安装将此行添加到您的应用程序的Gemfile中: gem 'activerecord-mysql-...

    Patron-ActiveRecord:JAVA中的Active Record持久性模式示例

    赞助人-ActiveRecord JAVA中的Active Record持久性模式示例

    activerecord-jwt

    ActiveRecord :: Jwt 此ActiveRecord扩展添加了jwt(JSON Web Token)方法 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-jwt' 然后执行: $ bundle 或将其自己安装为: $ gem install ...

    activerecord-relations_annotations:使用自定义数据注释 ActiveRecord 关系对象

    关系注解使用自定义数据注释 ActiveRecord 关系对象,允许关系的元数据可用于自定义代码。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord-relations_annotations' , '~&gt; 0.0.1' 然后执行: $ bundle...

    sexy_scopes:停止在ActiveRecord范围内编写SQL:拥抱Ruby!

    警告:此刻尚未维护,抱歉:(SexyScopes 无需SQL即可编写美观而富有表现力的ActiveRecord范围SexyScopes是一个宝石,它添加了语法糖来在Ruby中创建ActiveRecord范围,而不是SQL。 这样可以实现更具表现力,更不易...

    Castle.ActiveRecord (.NET FrameWork 2.0)

    Castle.ActiveRecord For .NET FrameWork 2.0 如果你想使用Castle.ActiveRecord,但又不想使用.NET Framework 3.0/3.5/4.0或更高版本,那么这个就是你所需要的,For .NET FrameWork 2.0,我整理了好久,自己从官方...

    dragonfly-activerecord:蜻蜓的 ActiveRecord 支持的数据存储

    为提供数据存储,由 ActiveRecord 支持。 需要使用 Dragonfly 1.0+ 的 Rails 应用程序。 经 MRI 1.9.3、2.0、2.1 测试; ActiveRecord 3.2 和 4.0; 和 MySQL、PostgreSQL 和 SQLite 存储。 用例 如果您的应用...

    rgeo-activerecord:RGeo ActiveRecord扩展和用于空间连接适配器的工具

    RGeo :: ActiveRecord是一个可选的模块,它为ActiveRecord提供空间扩展,以及一组用于基于RGeo编写空间ActiveRecord适配器的帮助程序。 概括 RGeo是使用Ruby编程语言编写位置感知应用程序的关键组件。 其核心是行业...

Global site tag (gtag.js) - Google Analytics