论坛首页 Java企业应用论坛

Hibernate和Spring的决裂以及Spring和EJB3之争

浏览 36945 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-09-18  
其实按照 Rod Johnson 的看法,EJB2.x 最大的问题还是其“委员会驱动”的开发模式。Hibernate 和 Spring 都是由实际需求驱动发展起来的,因此有着更加合理和实用的架构。EJB3 要想取得成功,就一定要完全摒弃以前的那种开发模式,这也是他们吸收 Gavin King 等实践经验丰富的人加入的原因。另外 Rod Johnson 在 J2EE without EJB 中对于 EJB2.x 的批判已经深入人心,EJB3 如果不彻底改头换面甚至走得更远,仍然会遭到开发者的诟病。J2EE without EJB 这本书已经把大家的口味搞得很挑剔了,现在不是什么技术只要盖上一个标准、一个专家委员会研究成果的印章就能为开发者所接受的了。

前些天 jini 和 banq 吵架的时候,我在 jini 的 blog 留言说让 jini 有空了来这里做做 EJB3 的普及工作。robbin 可以再联系一下。
0 请登录后投票
   发表时间:2005-09-18  
robbin 写道
JBoss和Oracle都会推出嵌入式的EJB3容器,特别是JBoss的EJB3嵌入式容器你已经可以在JBoss网站下载,也是通过和Spring一样的方式,jar文件是打包在WAR中的,在web.xml通过Servlet进行容器的初始化。

呵呵,JBoss能够这样干当然是好事。但是市场的领导者呢?BEA呢?IBM呢?他们的肯放弃应用服务器给他们带来的高额利润吗?

robbin 写道
Spring的Template方式确实有点过时了,因为EJB3处理同样的问题用的解决办法更加优雅。

robbin老大能讲讲EJB3的优雅的方法是怎样的吗?
由于Java语言里没有delegation,也没有closure,所以采用inner class和Template方式实现。但是我没觉得这样的实现有什么不优雅,inner class和delegation或closure其实没什么本质区别,只是语法上稍微烦了一点点。
0 请登录后投票
   发表时间:2005-09-18  
xiecc 写道
robbin 写道
JBoss和Oracle都会推出嵌入式的EJB3容器,特别是JBoss的EJB3嵌入式容器你已经可以在JBoss网站下载,也是通过和Spring一样的方式,jar文件是打包在WAR中的,在web.xml通过Servlet进行容器的初始化。

呵呵,JBoss能够这样干当然是好事。但是市场的领导者呢?BEA呢?IBM呢?他们的肯放弃应用服务器给他们带来的高额利润吗?

robbin 写道
Spring的Template方式确实有点过时了,因为EJB3处理同样的问题用的解决办法更加优雅。

robbin老大能讲讲EJB3的优雅的方法是怎样的吗?
由于Java语言里没有delegation,也没有closure,所以采用inner class和Template方式实现。但是我没觉得这样的实现有什么不优雅,inner class和delegation或closure其实没什么本质区别,只是语法上稍微烦了一点点。


Robbin所说的优雅方式是通过java5.0的新特性达到的吧。spring还要考虑到低版本的java,对于企业级应用而言,只能说各有长短吧。而且,ejb3倾向于使用太多的annotation,未必是件好事。
0 请登录后投票
   发表时间:2005-09-18  
引用
Robbin所说的优雅方式是通过java5.0的新特性达到的吧。spring还要考虑到低版本的java,对于企业级应用而言,只能说各有长短吧。而且,ejb3倾向于使用太多的annotation,未必是件好事。

多了解在做评论。ejb3当然倾向于用annotation,但ejb3同样为了兼容JDK 1.4提供xml配置。用什么你自己选择。

java 5.0的新特性还没这么牛。新一代的容器除了引入annotation,更多的简便,新特性是依赖很多这两年来发展和成熟起来的"新技术"(决非你想象中的java 5的那些个新特性)。由于你对ejb3 spec还不了解,暂时无法跟你讨论。

引用
That we conforms to EJB3 .0 doesn't mean we only do what the spec defines or what people think the spec is.

你理解我说的这句话么?"or what people think the spec is " 我说的就是向您这样的哥们。有些人连spec都没看过,就主观的去认为ejb3.0如何如何,如果你认真看过spec和理解了spec,根本不会有这样无聊的争论。spec是spec不是设计,如何实现,需要很多的创造。至于如何理解超越, 无意在争论。

引用
。但有一点是肯定的:出于商家的利益考虑,它必须运行在应用服务器上,而不能象Spring那样在任何的Web服务器上运行。

请了解规范后再做评论。不要主管想象。ejb3铁定可以在任何web服务器上运行。

事实上新的ejb3 spec几乎是现在所有在开源/商业软件中先进/实用技术的大融合,却有不仅仅是一个大杂会,而是做了进一步的发展。

如果你认真看过和理解了spec,你会对西方技术思潮的发展折服。中国人要能有这样的想象力还需要太长的时间。
0 请登录后投票
   发表时间:2005-09-19  
To xiecc,charon:

EJB3只是一个规范,至于实现方式要看厂商是如何去做的了。我看了一下Hibernate EJB3对于事务管理和资源管理的实现方式,其实并非你们所想的通过annotation去实现的,这里并不需要依赖annotation(虽然事务声明是使用annotation,但是不用也可以实现)。

我们首先考察一下事务管理:
Spring是通过给bean配置TransactionInterceptor的方式实现的,也就是通过AOP方式;
Hibernate EJB3实现方式比较类似,这两者的区别不太大,主要就是spring的事务声明是在XML配置文件中声明,Hibernate EJB3是通过annotation。

然后看一下资源管理:
Spring是通过Template的方式提供回调接口,让调用者无需关心资源的获取和释放;
Hibernate EJB3是通过IoC方式(annotation声明)来获得资源的引用,而资源的释放是自动关联到事务上的。

从调用代码上来看,确实EJB3的方式要优雅的多,不需要搞那么难看的Template。

Spring无法像EJB3那样去实现更加优雅的资源管理,主要原因在于Spring自己没有开发持久层!,它只是封装别人的持久层,如Hibernate,TopLink,JDO等等。而要实现EJB3那种资源管理方式,必须在持久层代码上做文章,Spring改不了别人的代码,spring作为一个业务层框架,在它这个层面来说,是无能为力的。
0 请登录后投票
   发表时间:2005-09-19  
robbin 写道
To xiecc,charon:

EJB3只是一个规范,至于实现方式要看厂商是如何去做的了。我看了一下Hibernate EJB3对于事务管理和资源管理的实现方式,其实并非你们所想的通过annotation去实现的,这里并不需要依赖annotation(虽然事务声明是使用annotation,但是不用也可以实现)。

我们首先考察一下事务管理:
Spring是通过给bean配置TransactionInterceptor的方式实现的,也就是通过AOP方式;
Hibernate EJB3实现方式比较类似,这两者的区别不太大,主要就是spring的事务声明是在XML配置文件中声明,Hibernate EJB3是通过annotation。

然后看一下资源管理:
Spring是通过Template的方式提供回调接口,让调用者无需关心资源的获取和释放;
Hibernate EJB3是通过IoC方式(annotation声明)来获得资源的引用,而资源的释放是自动关联到事务上的。

从调用代码上来看,确实EJB3的方式要优雅的多,不需要搞那么难看的Template。

Spring无法像EJB3那样去实现更加优雅的资源管理,主要原因在于Spring自己没有开发持久层!,它只是封装别人的持久层,如Hibernate,TopLink,JDO等等。而要实现EJB3那种资源管理方式,必须在持久层代码上做文章,Spring改不了别人的代码,spring作为一个业务层框架,在它这个层面来说,是无能为力的。

我坚信Spring 的将来版本肯定会消除Template 以及 需要 extract Interface的强制限制的。 
其实现在对于HIbernate 3的使用,也完全可以消除Template的依赖 ,因为Hibernate已经提供GetCurrentSESSION的实现,这是基于线程帮定管理sESSION的获取方式。
0 请登录后投票
   发表时间:2005-09-19  
firebody 写道

我坚信Spring 的将来版本肯定会消除Template 以及 需要 extract Interface的强制限制的。 
其实现在对于HIbernate 3的使用,也完全可以消除Template的依赖 ,因为Hibernate已经提供GetCurrentSESSION的实现,这是基于线程帮定管理sESSION的获取方式。


是的, 如果用H3.0.1以上版本的话,只用spring注入SessionFactory,然后改用getCurrentSession方法:
public class ProductDaoImpl implements ProductDao {
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory); {
        this.sessionFactory = sessionFactory;
    }

    public Collection loadProductsByCategory(String category); {
        return this.sessionFactory.getCurrentSession();
                .createQuery("from test.Product product where product.category=?");
                .setParameter(0, category);
                .list();;
    }
}


在目前的spring版本里面, jdo/toplink/ibatis2/h3,都可以不用template方式,而改用各个orm的native api去做,唯一的区别就是:有些orm用的是checked exception,需要多写try/catch
0 请登录后投票
   发表时间:2005-09-19  
引用
在目前的spring版本里面, jdo/toplink/ibatis2/h3,都可以不用template方式,而改用各个orm的native api去做,唯一的区别就是:有些orm用的是checked exception,需要多写try/catch

没记错的话需要使用spring的transaction proxy。
如果既可以不需要template,也不需要多谢try/catch,是不是更好?
0 请登录后投票
   发表时间:2005-09-19  
引用
没记错的话需要使用spring的transaction proxy。
如果既可以不需要template,也不需要多谢try/catch,是不是更好?


当然不错,但有没什么限制?
0 请登录后投票
   发表时间:2005-09-19  
引用
当然不错,但有没什么限制?

有!。你需要采用ejb3。 :-)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics