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。
分享到:
相关推荐
1. **配置JBoss**:首先,你需要将Spring和Hibernate的相关库添加到JBoss的类路径中,并且可能需要对JBoss的配置文件进行调整,以支持Spring和JTA。 2. **配置Spring**:创建Spring的配置文件,定义数据源、...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate...
这里,`java:comp/env/hibernate/session_factory`是JNDI查找的名称,它对应于hibernate.properties中配置的`hibernate.session_factory_name`,即使在Weblogic中实际名称需要以点号分隔。 通过以上步骤,我们成功...
- **JTA配置**:配置Hibernate使用JTA(Java Transaction API),在`hibernate.cfg.xml`文件中设置`transaction.factory_class`属性。 - **选项**:可以选择`org.hibernate.transaction.JTATransactionFactory`或`...
在这个集成案例中,JTA被用来协调Wicket、Spring、Hibernate和EJB之间的事务,确保即使在复杂操作中也能正确处理数据的提交和回滚。 在压缩包中的“wikiweb”可能是一个示例项目的名字,包含了实现这些技术集成的...
本文将详细介绍配置Hibernate所需的jar包以及它们在Hibernate工作流程中的作用。 1. **hibernate-core.jar**: 这是Hibernate的核心库,包含了ORM(对象关系映射)的主要功能,如实体管理、会话工厂、查询语言(HQL)...
Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通过SessionFactory的`beginTransaction()`、`commit()`和`rollback()`方法进行事务控制。 以上仅为部分面试题及解答,涵盖了Hibernate的基础概念、优点...
在这个“Hibernate3.3中的lib”资源包中,包含了一系列在Java开发中用于支持Hibernate 3.3版本运行所必需的库文件。这些jar包是 Hibernate 框架正常工作的重要组成部分,也是许多企业级应用开发的基础。 1. **...
Wicket6.7 Spring3.2 Hibernate4.2 EJB全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。
尽管JPA允许使用注解代替XML配置,但仍然需要一个名为persistence.xml的配置文件来指定数据源和其他服务器特定的属性,如在JBoss中配置Hibernate。 ```xml <persistence-unit name="Ejb3Tutorial"> <jta-data-...
此外,`hibernate.transaction.factory_class`是关于事务管理的配置,如果在EJB或JTA环境中使用Hibernate,需要启用此选项,指定事务工厂类,如`net.sf.hibernate.transaction.JTATransactionFactory`。 总结来说,...
6. **EJB3**:在ejb3-persistence.jar中,包含了对EJB3规范的支持,使得Hibernate可以很好地集成到Java EE环境中。 7. **Commons Logging**:log4j.jar或commons-logging.jar是日志处理库,Hibernate使用它们来记录...
2. **JTA事务**:适合于应用服务器环境,Hibernate可以集成到EJB容器中,利用容器提供的全局事务管理。 ### Hibernate 查询 Hibernate 提供了多种查询方式: 1. **HQL(Hibernate Query Language)**:类似于SQL...
在EJB3 中,实体Bean 采用了更为简洁的编程模型,这得益于对Hibernate设计理念的学习和借鉴。EJB3 中的实体Bean 可以直接映射到数据库表,简化了开发过程。 #### 持久化单元的定义及作用 持久化单元是一个重要的...
Hibernate是一款强大的对象关系映射(ORM)框架,它在Java开发中被广泛使用,用于简化数据库操作。在Java应用程序中,Hibernate提供了一种抽象层,允许开发者使用面向对象的编程方式来处理数据库交互,而无需直接...
综上所述,为了在Tomcat中成功调用EJB,你需要确保这些必要的jar文件被添加到WEB-INF/lib目录下,这样Tomcat在启动时能够找到并加载它们,从而提供EJB所需的功能和支持。正确的配置和使用这些库是确保EJB在Tomcat...
在Java应用中,尤其是在企业级应用开发中,Hibernate是必不可少的组件之一。标题提到的是"hibernate4.3.11所需jar包",这意味着我们将探讨的是Hibernate 4.3.11版本所依赖的一系列库文件。 1. **Hibernate Core**: ...
总结,配置JBoss 6.0.0 M4中的JNDI和Hibernate,涉及到了数据源的创建、Hibernate的配置以及如何在应用程序中使用这些配置。理解并掌握这些知识点对于构建基于Java EE的分布式企业应用至关重要。通过合理配置,我们...
还有其他如`jta.jar`、`ejb3-persistence.jar`等,它们为分布式事务和EJB3持久化提供了支持。 在API方面,`hibernate-release-4.3.5.Final`中的`documentation`目录包含了详尽的用户指南和API文档。开发者可以通过...
其中,@EJB注释是用于依赖注入(Dependency Injection)的关键元素,使得开发者能够直接在类中声明并注入EJB组件,而无需手动查找和管理它们。下面我们将详细探讨@EJB注释的常用属性及其用法。 1. **@EJB注释的属性...