`
bruce008
  • 浏览: 173391 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在EJB 中 配置Hibernate支持JTA

    博客分类:
  • J2EE
阅读更多

Finally,  搞清楚了些Hibernate 的对JTA 的支持。 

 

有几个非常重要的property 需要配置

<prop key="hibernate.current_session_context_class">

jta

</prop>

 

<prop   key="hibernate.transaction.manager_lookup_class">

org.hibernate.transaction.WebSphereTransactionManagerLookup

</prop>


<prop key="hibernate.transaction.factory_class">

org.hibernate.transaction.CMTTransactionFactory

</prop>


1, hibernate.transaction.manager_lookup_class 是用来在SessionFactory 起来的时候调用在 获取 TransactionManager 的, 在 WebSphere 下比较特殊用 这个  WebSphereTransactionManagerLookup。 其它的很多应用服务器比如GlassFish 是通过JNDI 来得到 TransactionManager 的。 GlassFish 下用  
  org.hibernate.transaction.SunONETransactionManagerLookup
     这样Hibernate就可以拿到正确的TransactionManager 了。

2, hibernate.current_session_context_class  是用来配置 SessionContext 的, 它跟SessionFactory 一样可以理解成是个单例。 一个Hibernate configuration 对应一个SessionFactory, 一个SessionFactory 对应一个CurrentSessionContext.  在应用程序中 我们最好是都通过 SessionFactory.getCurrentSession() 来获取Session。它的过程大概是这样的,  

    2.1  SessionFactory.getCurrentSession() 会调用 JTASessionContext.currentSession();
   
    2.2  JTASessionContext 维护了一个 trasaction 跟 session 的 map。JTASessionContext.currentSession() 的逻辑是先 根据TractionManager 获取当前 tranction , 然后 来这个map 找对应的session 如果没有 就创建一个新的SessionImpl。
    2.3  在SessionImpl 建构函数中 会创建一个新的JDBCContext. 这个JDBCContext 名字比较悲催啊其实不管是JDBC 还是JTA 都是需要它的。 以前被它给忽悠了, 其实在JTA的环境下它的作用更大的说。在它的建构函数中 调用了一个  非常重要的方法 registerSynchronizationIfPossible。
    public boolean registerSynchronizationIfPossible() {
		if ( isTransactionCallbackRegistered ) {
			// we already have a callback registered; either a local
			// (org.hibernate.Transaction) transaction has accepted
			// callback responsibilities, or we have previously
			// registered a transaction synch.
			return true;
		}
		boolean localCallbacksOnly = owner.getFactory().getSettings()
				.getTransactionFactory()
				.areCallbacksLocalToHibernateTransactions();
		if ( localCallbacksOnly ) {
			// the configured transaction-factory says it only supports
			// local callback mode, so no sense attempting to register a
			// JTA Synchronization
			return false;
		}
		TransactionManager tm = owner.getFactory().getTransactionManager();
		if ( tm == null ) {
			// if there is no TM configured, we will not be able to access
			// the javax.transaction.Transaction object in order to
			// register a synch anyway.
			return false;
		}
		else {
			try {
				if ( !isTransactionInProgress() ) {
					log.trace( "TransactionFactory reported no active transaction; Synchronization not registered" );
					return false;
				}
				else {
					javax.transaction.Transaction tx = tm.getTransaction();
					if ( JTAHelper.isMarkedForRollback( tx ) ) {
						// transactions marked for rollback-only cause some TM impls to throw exceptions
						log.debug( "Transaction is marked for rollback; skipping Synchronization registration" );
						return false;
					}
					else {
						if ( hibernateTransaction == null ) {
							hibernateTransaction = owner.getFactory().getSettings().getTransactionFactory().createTransaction( this, owner );
						}
						tx.registerSynchronization( new CacheSynchronization(owner, this, tx, hibernateTransaction) );
						isTransactionCallbackRegistered = true;
						log.debug("successfully registered Synchronization");
						return true;
					}
				}
			}
			catch( HibernateException e ) {
				throw e;
			}
			catch (Exception e) {
				throw new TransactionException( "could not register synchronization with JTA TransactionManager", e );
			}
		}
	}
 


这个方法 中的  owner.getFactory().getSettings().getTransactionFactory()  就用到了三个配置参数中的最后一个 org.hibernate.transaction.CMTTransactionFactory 。  这个TransactionFactory 的 areCallbacksLocalToHibernateTransactions  返回 false。 如果我们不配置这个参数  owner.getFactory().getSettings().getTransactionFactory()  拿到的就是 JDBCTransactionFactory 了,  它就当然不会走到后面的   
      tx.registerSynchronization( new CacheSynchronization(owner, this, tx, hibernateTransaction) );

     这一行代码 会在JTA transaction 注册一个 Synchronization:CacheSynchronization。

   2.4 在CacheSynchronization 实现的 beforeCompletion 方法中 调用 sessionImpl.managedFlush() 方法。 

这样我们可以看到 JTA 下面  transaction 跟 session 是 一对一, 在transaction 结束的时候 flush , close session。  当然我们需要我们通过 JTASessionContext.currentSession()  来保证 都是走 JTASessionContext 来管理 session。  


分享到:
评论

相关推荐

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    1. **配置JBoss**:首先,你需要将Spring和Hibernate的相关库添加到JBoss的类路径中,并且可能需要对JBoss的配置文件进行调整,以支持Spring和JTA。 2. **配置Spring**:创建Spring的配置文件,定义数据源、...

    Eclipse中Hibernate简单配置和使用

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate...

    在Weblogic上配置Hibernate为JNDI

    这里,`java:comp/env/hibernate/session_factory`是JNDI查找的名称,它对应于hibernate.properties中配置的`hibernate.session_factory_name`,即使在Weblogic中实际名称需要以点号分隔。 通过以上步骤,我们成功...

    在 Weblogic 8.1上配置 Hibernate 3.0

    - **JTA配置**:配置Hibernate使用JTA(Java Transaction API),在`hibernate.cfg.xml`文件中设置`transaction.factory_class`属性。 - **选项**:可以选择`org.hibernate.transaction.JTATransactionFactory`或`...

    Wicket6.0_Spring3.1_Hibernate4.1_EJB全注解实例

    在这个集成案例中,JTA被用来协调Wicket、Spring、Hibernate和EJB之间的事务,确保即使在复杂操作中也能正确处理数据的提交和回滚。 在压缩包中的“wikiweb”可能是一个示例项目的名字,包含了实现这些技术集成的...

    配置Hibernate所需的jar包

    本文将详细介绍配置Hibernate所需的jar包以及它们在Hibernate工作流程中的作用。 1. **hibernate-core.jar**: 这是Hibernate的核心库,包含了ORM(对象关系映射)的主要功能,如实体管理、会话工厂、查询语言(HQL)...

    Hibernate 50个 英文面试题和答案

    Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通过SessionFactory的`beginTransaction()`、`commit()`和`rollback()`方法进行事务控制。 以上仅为部分面试题及解答,涵盖了Hibernate的基础概念、优点...

    Hibernate3.3中的lib

    在这个“Hibernate3.3中的lib”资源包中,包含了一系列在Java开发中用于支持Hibernate 3.3版本运行所必需的库文件。这些jar包是 Hibernate 框架正常工作的重要组成部分,也是许多企业级应用开发的基础。 1. **...

    Wicket6.7_Spring3.2_Hibernate4.2_EJB全注解实例

    Wicket6.7 Spring3.2 Hibernate4.2 EJB全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。

    EJB2和EJB3的架构异同.doc

    尽管JPA允许使用注解代替XML配置,但仍然需要一个名为persistence.xml的配置文件来指定数据源和其他服务器特定的属性,如在JBoss中配置Hibernate。 ```xml &lt;persistence-unit name="Ejb3Tutorial"&gt; &lt;jta-data-...

    Hibernate入门 - 基础配置详细说明

    此外,`hibernate.transaction.factory_class`是关于事务管理的配置,如果在EJB或JTA环境中使用Hibernate,需要启用此选项,指定事务工厂类,如`net.sf.hibernate.transaction.JTATransactionFactory`。 总结来说,...

    hibernate3.3 jar包

    6. **EJB3**:在ejb3-persistence.jar中,包含了对EJB3规范的支持,使得Hibernate可以很好地集成到Java EE环境中。 7. **Commons Logging**:log4j.jar或commons-logging.jar是日志处理库,Hibernate使用它们来记录...

    hibernate缓存和事务

    2. **JTA事务**:适合于应用服务器环境,Hibernate可以集成到EJB容器中,利用容器提供的全局事务管理。 ### Hibernate 查询 Hibernate 提供了多种查询方式: 1. **HQL(Hibernate Query Language)**:类似于SQL...

    hibernate4.3.11所需jar包

    在Java应用中,尤其是在企业级应用开发中,Hibernate是必不可少的组件之一。标题提到的是"hibernate4.3.11所需jar包",这意味着我们将探讨的是Hibernate 4.3.11版本所依赖的一系列库文件。 1. **Hibernate Core**: ...

    EJB3(中文版)PDF

    在EJB3 中,实体Bean 采用了更为简洁的编程模型,这得益于对Hibernate设计理念的学习和借鉴。EJB3 中的实体Bean 可以直接映射到数据库表,简化了开发过程。 #### 持久化单元的定义及作用 持久化单元是一个重要的...

    Hibernate所需要的jar包

    Hibernate是一款强大的对象关系映射(ORM)框架,它在Java开发中被广泛使用,用于简化数据库操作。在Java应用程序中,Hibernate提供了一种抽象层,允许开发者使用面向对象的编程方式来处理数据库交互,而无需直接...

    tomcat调用EJB必须的包.rar

    综上所述,为了在Tomcat中成功调用EJB,你需要确保这些必要的jar文件被添加到WEB-INF/lib目录下,这样Tomcat在启动时能够找到并加载它们,从而提供EJB所需的功能和支持。正确的配置和使用这些库是确保EJB在Tomcat...

    Jboss6.0.0 M4配置jndi和hibernate

    总结,配置JBoss 6.0.0 M4中的JNDI和Hibernate,涉及到了数据源的创建、Hibernate的配置以及如何在应用程序中使用这些配置。理解并掌握这些知识点对于构建基于Java EE的分布式企业应用至关重要。通过合理配置,我们...

    hibernate-release-4.3.5

    还有其他如`jta.jar`、`ejb3-persistence.jar`等,它们为分布式事务和EJB3持久化提供了支持。 在API方面,`hibernate-release-4.3.5.Final`中的`documentation`目录包含了详尽的用户指南和API文档。开发者可以通过...

    Ejb3中的注释常用属性

    其中,@EJB注释是用于依赖注入(Dependency Injection)的关键元素,使得开发者能够直接在类中声明并注入EJB组件,而无需手动查找和管理它们。下面我们将详细探讨@EJB注释的常用属性及其用法。 1. **@EJB注释的属性...

Global site tag (gtag.js) - Google Analytics