精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-11
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种方式获取想要的对象)。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间: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,以更方便。 |
|
返回顶楼 | |
发表时间:2007-12-12
关键不在于写在哪里,而在于你的查询方式。提供同样的接口,写在DAO和写在ActiveRecord里面是一样的。
|
|
返回顶楼 | |
发表时间:2007-12-21
这要从系统规模的大小来决定, 如果一个系统中只有几个或十几个模型, 那么用ActiveRecord 模式还是不错的方案, 但是如果一个系统中有成百或成千个模型,那么就应该用Manager 模式来代替了,这样我们可以做一个抽象的CRUD或查询接口,它可以接受所有模型,这样就不需要在每个模型的写查询或更新代码了.
有人会说可以通过继承的方式来实现呀,不要忘了Java 中只能继承一个类,如果模型本身就用继承关系,这样查询的代码就很难通过继承来实现了.
|
|
返回顶楼 | |
发表时间:2007-12-21
都成动态语言了
|
|
返回顶楼 | |
发表时间:2007-12-21
直接Grails吧。
|
|
返回顶楼 | |
发表时间:2007-12-23
如果应用系统可以完全屏蔽数据库,只要操作领域对象,且业务逻辑简单到如此地步,不考虑事务隔离级别,不考虑事务控制、不考虑多线程并发、不考虑批量数据提交、不考虑异步操作,不考虑权限,不考虑业务异常...,也就无所谓什么方式了。还真不如换了rails...
|
|
返回顶楼 | |
发表时间:2008-01-20
这种做法挺像db4o的
也许真正的充血模型的实现依靠对象数据库来实现 |
|
返回顶楼 | |
发表时间:2008-01-20
全部是靠静态方法获得对象,这个操作如何MOCK?如可单元测试?
|
|
返回顶楼 | |