Struts应用程序中的EJB和Hibernate

问题描述:

我有一个具有struts 1.1和EJB 2组合的应用程序,但现在我们正在用hibernate 3.2引入一个新的应用程序。 hibernate DAO与EJB 2会话bean DAO与纯JDBC并行运行。在这种情况下,我担心jdbc连接管理。由于EJB 2.0具有容器管理的连接和事务。但是在休眠的情况下,我们开始并提交一个hibernate事务,假设这个体系结构不会有任何问题是否安全。Struts应用程序中的EJB和Hibernate

需要一些分析帮助。

PM


我正在考虑对同一问题,如果正在使用的可能访问现有的表休眠模块JDBC DAO的,其交易是通过会话Bean管理。但这里是我的方法:

  1. 我会调用EJB会话Bean,并因为这个bean将负责管理事务的委托,我会创造我休眠DAO的从这个会话bean调用它们,我认为这不会有任何问题。

  2. 此应用程序的hibernate会话工厂将使用hibernate插件实例化,hibernate插件将成为struts config xml的一部分,并将作为servlet上下文的一部分保存,然后操作类将通过此sessionfactory实例EJB会话bean委托给hibernate DAO。

  3. 我想这将是一个干净的方法,因为事务将由部署到Websphere上的EJB会话bean管理。 JDBC连接池管理自从在websphere上配置并使用数据源访问,hibernate不必担心这一点。

请帮助我,如果我在正确的道路上与我的假设?

+0

Hibernate应该参与你的容器管理事务,你不应该需要一个平行设施。我认为你应该担心,因为你描述的东西并不正确。 – 2010-11-09 16:43:28

划分工作的逻辑单位,因此是固有的孤立。但我想知道为什么你需要两者的结合。如果您已经在使用EJB2 + JDBC,为什么不坚持这一点?

可以在CMT(或BMT)会话bean没有任何问题的情况下使用Hibernate,与JDBC代码共享连接池并参与相同的事务。

查看整个部分11.2. Database transaction demarcation并且特别是11.2.2. Using JTA

不清楚的是Hibernate模块是否会与通过JDBC管理的实体“隔离”。如果你同时通过API来访问相同的表,你就必须采取一些预防措施:

  • 不要指望在Hibernate中实体的图形混合JDBC实体(反有可能虽然)。
  • 尊重和模仿Hibernate的乐观并发策略通过JDBC
  • 更新行时绕过Hibernate的API将不会触发任何缓存更新(如果你使用的二级高速缓存),在这种情况下你必须自己触发它。

以下是可能的解决方案

一个共同的JNDI数据源,这将既EJB的和Hibernate使用的一个。