Struts应用程序中的EJB和Hibernate

时间:2010-11-09 16:06:09

标签: java hibernate java-ee struts-1 ejb-2.x

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

需要一些分析帮助。

PM


我正在考虑同样的问题,如果hibernate模块可能访问JDBC DAO使用的现有表,其事务由Session Beans管理。但这是我的方法:

  1. 我将有一个调用EJB会话bean的委托,并且由于这个bean将负责管理事务,我将创建我的hibernate DAO并从这个会话bean中调用它们,我认为它们没有任何的问题。

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

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

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

3 个答案:

答案 0 :(得分:0)

交易划分了逻辑工作单元,因此本质上是孤立的。但我想知道为什么你需要两者的结合。如果您已经在使用EJB2 + JDBC,为什么不坚持这个呢?

答案 1 :(得分:0)

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

请参阅整个部分11.2. Database transaction demarcation,特别是11.2.2. Using JTA

目前尚不清楚的是,Hibernate模块是否会与通过JDBC管理的实体“隔离”。如果您通过两种API访问相同的表,则必须采取一些预防措施:

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

答案 2 :(得分:0)

这是可能的解决方案之一

一个常见的JNDI数据源,它将在EJB和Hibernate中使用。