0 0

Hibernate和纯jdbc连接共同使用产生的事务问题30

最近在项目里遇到了一个问题,新系统持久化使用的是hibernate3,但是为了实现一些功能必须调用一个另外的老系统(和新系统是同一个数据库,部署在同一个wls的domain下)的jar包内提供的方法,但是这个老的系统持久化使用的是jdbc的方式连接的数据库,但是数据源的获取方式和新系统一样,都是通过jndi从wls上查找。可是这样就产生了事务问题,hibernate3的事务提交都是用spring控制的,而老系统的jar方法必须要手动commit才能提交事务,可是这样,一旦hibernate的事务异常,产生了回滚,jar包提供的方法持久化的数据就无法回滚。

各位持久化方面的大师,有没有什么好的建议,怎么解决这个问题,或者有其他的方法让hibernate和jdbc的方式和平共处。
问题补充:
感谢各位的关注,不过我找到了一个刚好的方法,Spring里有个DataSourceUtil的类,通过getConnection方法可以把当前连接和当前线程绑定,这样两种持久化的方式使用的是同一个connection,也就达到了事务一致。
2008年6月22日 19:29

3个答案 按时间排序 按投票排序

0 0

采纳的答案

可以用JOTM或者类似的JTA来做这个事情。也就是说把JDBC和Hibernate当成跨数据库事务来做,就算是同一个数据库schema。
下面一JOTM为例子。

<?xml version="1.0" encoding="UTF-8"?>
<beans>
 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
<!-- transactionManagerHibernate 这个作为Hibernate的transactionManager -->
 <bean id="transactionManagerHibernate" class="org.springframework.transaction.jta.JtaTransactionManager">
   <property name="userTransaction" ref="jotm"/>
 </bean>
<!-- 内部数据源 1 -->
 <bean id="innerDataSourceJDBC" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
   <property name="transactionManager" ref="jotm"/>
   <property name="driverName" value="..."/>
   <property name="url" value="..."/>
   <property name="user" value="..."/>
   <property name="password" value="..."/>
 </bean>
<!-- 用继承这个类改写,并实现InitializingBean,在afterProperty把这个数据绑定到JDBC要用到的JNDI名字上!!! -->
 <bean id="dataSourceJDBC" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
   <property name="dataSource" ref="innerDataSource"/>
   <property name="user" value="..."/>
   <property name="password" value="..."/>
   <property name="maxSize" value="..."/>
 </bean>
 
 <!-- 内部数据源 2 -->
 <bean id="innerDataSourceHibernate" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
   <property name="transactionManager" ref="jotm"/>
   <property name="driverName" value="..."/>
   <property name="url" value="..."/>
   <property name="user" value="..."/>
   <property name="password" value="..."/>
 </bean>
<!-- 把此数据源给spring内的Hibernate使用,替换原来从JNDI获得的数据源。  -->
 <bean id="dataSourceHibernate" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
   <property name="dataSource" ref="innerDataSourceHibernate"/>
   <property name="user" value="..."/>
   <property name="password" value="..."/>
   <property name="maxSize" value="..."/>
 </bean>
 
</beans>


原理:从上面两个数据源获得的数据库连接(都是org.enhydra.jdbc.standard.StandardXAConnection
)都在JTA控制之下,其中一个连接失败,那么另外一个会回滚。
难点是将spring的数据源绑定到JNDI,因为我没做过。。。。



2008年6月23日 02:21
0 0

让老系统的Service提供一个方法, 只是用于抛出一个异常.

新系统的servcie发现这边抛了异常, 直接调用老系统的service 让它也抛一个异常.


理论上最简单,最可行.


等你真正要研究 Hibernate和JDBC整合的时候,再用楼上的代码即可.

2008年6月23日 12:41
0 0

Hibernate回调JDBC模板

2008年6月22日 23:29

相关推荐

    hibernate+junit+mysql-jdbc开发核心jar包三合一

    在Hibernate配置中,开发者需要指定JDBC驱动和连接URL,以便Hibernate能够通过JDBC连接到MySQL数据库。 在实际开发中,这三者结合使用的方式通常是:首先,通过Hibernate配置文件设置数据库连接参数,利用Hibernate...

    Java Dao JDBC Hibernate XMLmapping 代码

    最后,"tp3"可能是一个项目或测试模块的名称,表示这是一个关于DAO、JDBC、Hibernate和XML mapping的第三部分练习或测试用例,用于实践和检验上述技术的正确使用。 综上所述,这个项目涵盖了Java后端开发中数据库...

    springmvc+hibernate(连接sql)的增删改

    标题中的“springmvc+hibernate(连接sql)的增删改”指的是使用Spring MVC作为Web应用程序的前端控制器,结合Hibernate作为持久层框架,来实现对SQL数据库的CRUD(创建、读取、更新和删除)操作。Spring MVC是Spring...

    spring+struts+hibernate+jdbc+oracle+jms+flex+flamingle+jquery+plsql

    在Hibernate等ORM框架下,JDBC作为底层支持,用于执行SQL语句和管理数据库连接。 Oracle是一款高性能的关系型数据库管理系统,广泛应用于大型企业,支持复杂的数据结构和事务处理,与Java和Spring有良好的兼容性。 ...

    hibernate_reference使用指南全

    解释如何配置 Hibernate 以使用特定的 JDBC 数据库驱动和连接池。 - **3.4 可选配置属性** 列举了一些可选的配置属性,如 SQL 方言、外键查询、二进制流处理等。 - **3.4.1 SQL 方言** Hibernate 支持多种...

    java 教程包含(hibernate struts Spring Servlet JDBC 基础)

    学习JDBC包括理解连接池管理、预编译语句、事务处理和结果集的处理等概念。 2. **Servlet**:Servlet是Java Web应用的核心组件,用于接收和响应HTTP请求。它们是服务器端的Java程序,可以动态生成HTML或其他内容。...

    hibernate、struts、mysql_jdbc、junit

    这极大地提高了开发效率,减少了因数据库平台差异导致的问题,并提供了事务管理和缓存机制,使得应用程序更加健壮。 2. **Struts**: Struts是基于MVC(Model-View-Controller)设计模式的Java Web框架,主要用于...

    hibernate4.3.11所需jar包

    3. **配置**: Hibernate的使用通常需要一个`hibernate.cfg.xml`配置文件,其中定义了数据库连接参数、方言、缓存策略、实体类等信息。 4. **实体类和映射**: Hibernate通过实体类来映射数据库表,实体类上使用注解...

    hibernate所有用到的jar包

    这个压缩包包含了使用Hibernate框架所必需的所有JAR文件,这些文件提供了Hibernate的核心功能和依赖的库。让我们逐一了解这些JAR包的重要性和作用。 1. **hibernate-core.jar**:这是Hibernate的核心库,包含了...

    Struts2+spring+hibernate中的proxool连接池配置

    在Java Web开发中,Struts2、Spring和Hibernate是经典的MVC框架组合,它们共同构建了一个强大且灵活的后端架构。在这个组合中,数据库连接管理是一个关键环节,而Proxool作为一款轻量级的连接池库,常被用来优化...

    精通Hibernate源代码jar包3

    在`org.hibernate.stat`和`org.hibernate.engine.jdbc.spi`等包中,可以看到这些统计和调试工具的实现。 通过深入学习和理解这些源代码,开发者不仅可以解决实际遇到的问题,还能提升对ORM框架设计模式的理解,从而...

    hibernate_in_action 源码

    源码是作者为了配合书中的理论和示例而提供的实践素材,旨在帮助读者深入理解Hibernate的工作原理和使用方式。这里我们将围绕Hibernate的核心概念、主要功能以及如何通过源码学习 Hibernate 进行详细讨论。 1. ...

    建连接池 hibernate copo3 spring

    在本教程中,我们将深入探讨如何在使用Hibernate作为ORM工具、Spring作为核心框架的情况下,建立和配置数据库连接池。 首先,让我们了解一下Hibernate。Hibernate是一种对象关系映射(ORM)框架,它允许开发者用...

    spring3.0+hibernate3.3+mysql8.0

    2. **配置文件**:编写`applicationContext.xml`(Spring配置)和`hibernate.cfg.xml`(Hibernate配置),定义bean、数据源、session工厂等,并配置数据库连接参数。 3. **实体类和映射文件**:创建Java实体类来...

    hibernate所包含的所有jar包

    这些jar包共同构成了Hibernate框架的基础,确保了你可以在Java项目中顺利使用Hibernate进行数据持久化操作。在使用过程中,你需要根据项目配置XML文件(如hibernate.cfg.xml)来指定数据库连接信息、实体类、映射...

    JDBC封装.rar

    "JDBC封装"是指将常见的数据库操作,如增删改查(CRUD:Create, Read, Update, Delete),进行模块化和抽象化的过程,以便于在代码中重复使用和简化数据库交互。下面将详细介绍JDBC封装的原理、步骤以及它带来的好处...

    Hibernate3.3jar包

    以上是关于Hibernate 3.3的一些核心概念和使用方法,这个压缩包中的所有jar文件共同构成了开发Hibernate应用程序的基础环境。通过理解并熟练掌握这些知识点,开发者可以更高效地进行数据库操作,实现面向对象编程与...

    hibernate测试

    通过使用Hibernate,开发者可以避免编写大量的JDBC代码,而是专注于业务逻辑,从而提高开发效率。 2. **实体与映射** 在Hibernate中,实体是数据库表的Java类表示,它们通过一个名为`hibernate-mapping`的XML文件...

    hibernate需要jar包

    3. **C3P0**:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了对数据库连接的自动获取与释放,以及连接池的管理功能。在Hibernate中,C3P0用于管理数据库连接,提高数据库访问性能和效率。 除了这些,...

    hibernate类库

    描述中提到了"包括mysql的驱动",这表明这个类库还包含了用于连接MySQL数据库的JDBC驱动,使得Hibernate能够与MySQL数据库进行通信。"mapping和configuration的dtd文件"则是Hibernate配置和映射文件的定义,它们定义...

Global site tag (gtag.js) - Google Analytics