hibernate和jdbc事务统一控制
“Hibernate与JDBC(iBATIS) 都使用 DataSourceTransactionManager 同样可以保证事务
原理就是保证了 connection 的唯一性。
jdbc我是调spring的jdbcTemplate来操作,
经过测试。在同一个数据源的情况下直接使用Hibernate的TxManager可以同步事务,问题解决。
”
Rod Johnson的话:
引用
It is possible--and sometimes useful--to have coordinated transactions for both. Your JDBC transactions will be managed by the HibernateTransactionManager if you work with the same JDBC DataSource in the same transaction. That is, create the SessionFactory using Spring's SessionFactoryBean using the same DataSource that your JdbcTemplates use.
The only issue to watch, of course, is that you may be invalidating your Hibernate cache by JDBC changes. Generally I find it best to use JDBC to update only tables that don't have Hibernate mappings.
Juergen Hoeller的话:
引用
As Rod said, simply keep using HibernateTransactionManager, which auto-detects the DataSource used by Hibernate and seamlessly exposes Hibernate transactions as JDBC transactions for that DataSource. JDBC code that accesses the same DataSource via Spring will automatically participate in such transactions.
Note that you must specify the DataSource for Hibernate via LocalSessionFactoryBean's "dataSource" property to allow HibernateTransactionManager to auto-detect it. Alternatively, you can explicitly pass the DataSource to HibernateTransactionManager's "dataSource" property.
由此可见要保证事务的一致性,在spring下面的配置还是很方便的。
详细实例如下:(这是我自己机器上的例子,已经测试通过)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
- <!--
- - Application context definition for PetClinic on JDBC.
- -->
- <beans>
- <!-- ========================= RESOURCE DEFINITIONS ========================= -->
- <!-- Configurer that replaces ${...} placeholders with values from a properties file -->
- <!-- (in this case, JDBC-related settings for the dataSource definition below) -->
- <!--
- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="location" value="/WEB-INF/jdbc.properties"/>
- </bean>
- -->
- <!--
- Simple local DataSource that works in any environment.
- This uses the JDBC DriverManager to obtain connections, and does NOT perform connection
- pooling. Connection pooling is essential to all real-world applications.
- This definition is good for getting started, as it introduces no dependencies beyond
- the JDK, but DriverManagerDataSource is not intended for production usage.
- -->
- <!--
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- -->
- <!-- 在spring中直接配置jdbc链接 测试的时候可以使用!
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"
- value="net.sourceforge.jtds.jdbc.Driver" />
- <property name="url"
- value="jdbc:jtds:sqlserver://localhost:1433/gjxt;SelectMethod=cursor;charset=GBK;tds=8.0;lastupdatecount=true" />
- <property name="username" value="sa" />
- <property name="password" value="sa" />
- </bean>-->
- <!-- 通过proxool来配置数据源-->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"
- value="org.logicalcobwebs.proxool.ProxoolDriver" />
- <property name="url"
- value="proxool.qxgldb" />
- </bean>
- <!--
- Alternative local DataSource that works in any environment, and offers much better performance.
- Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
- for the required JAR files. See the PetStore sample application also shipped with
- Spring, for an example of Commons DBCP usage and the necessary build script.
- Alternatively you can use another connection pool such as C3P0, similarly configured
- using Spring.
- A standalone connection pool such as Commons DBCP is a good choice for use outside an
- application server environment, including web applications running in a web container without
- JTA, or integration testing using the org.springframework.test package.
- -->
- <!--
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- -->
- <!-- JNDI DataSource for J2EE environments -->
- <!--
- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName" value="java:comp/env/jdbc/petclinic"/>
- </bean>
- -->
- <!-- 本地jdbc连接抽取器和oracle lobhandler类 用于存取流程定义文件 -->
- <bean id="nativeJdbcExtractor"
- class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
- lazy-init="true" />
- <bean id="oracleLobHandler"
- class="org.springframework.jdbc.support.lob.OracleLobHandler"
- lazy-init="true">
- <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" />
- </bean>
- <bean id="defaltLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"
- lazy-init="true">
- </bean>
- <!-- session factory for sql server, 指定了lobHandler -->
- <!-- -->
- <bean id="MyHibernateSessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="lobHandler">
- <ref bean="defaltLobHandler" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.SQLServerDialect
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- </props>
- </property>
- <property name="mappingJarLocations">
- <list>
- <value>
- WEB-INF/lib/fireflow*.jar
- </value>
- </list>
- </property>
- <property name="mappingLocations">
- <list>
- <value>
- WEB-INF/classes/org/fireflow/example/**/*.hbm.xml
- </value>
- </list>
- </property>
- </bean>
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory">
- <ref bean="MyHibernateSessionFactory" />
- </property>
- </bean>
- <!-- Transaction manager for a single JDBC DataSource (alternative to JTA)
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>-->
- <!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
- <!--
- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
- -->
- <bean id="baseTransactionProxy" abstract="true"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="create*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="update*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="delete*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="retrieve*">
- PROPAGATION_REQUIRED,readOnly
- </prop>
- <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
- <!--
- 通过BeanNameAutoProxyCreator来实现spring的事务控制-->
- <bean
- class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
- <property name="transactionInterceptor"
- ref="transactionInterceptor" />
- </bean>
- <bean id="transactionInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="create*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="update*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="delete*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="retrieve*">
- PROPAGATION_REQUIRED,readOnly
- </prop>
- <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
- <bean
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <value>*ServiceDao</value>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
- <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
- </beans>
相关推荐
JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了高度的抽象层,允许Java开发者在不深入了解底层...
标题提到的"类似hibernate的jdbc封装"就是这样的一个实践,它试图在不引入庞大框架的情况下,提供类似Hibernate的便捷性。 首先,我们来了解JDBC(Java Database Connectivity),它是Java中用于连接数据库的标准...
然而,为了使Hibernate正常工作,我们需要依赖一些外部库,包括JDBC驱动和连接池管理工具。标题提到的“hibernate jdbc需要用的jar”指的是在使用Hibernate进行数据库交互时,必不可少的两个组件。 首先,`commons-...
JDBC提供了更多的灵活性和控制力,适合对性能有特殊需求或者需要精确控制SQL查询的情况;而Hibernate则更适合于需要快速开发、减少编码量并关注业务逻辑的场景。选择哪种方式取决于具体项目的需求和技术团队的能力...
Hibernate支持JDBC事务和JTA(Java Transaction API)事务,可以与Spring的事务管理机制集成,实现统一的事务策略。 在SSH事务配置中,提到的“通用性”是指通过合理配置,可以将事务管理应用到多个DAO(数据访问...
4. **一致性和兼容性**:JDBC的目标是提供一个统一的接口,无论底层数据库是什么,都能提供一致的行为。这使得开发者无需因数据库类型的变化而修改大量代码。 5. **简化数据库操作**:JDBC提供了一些高级功能,如...
Hibernate通过封装JDBC或JTA事务管理,为Java开发者提供了一套易于使用的事务管理API,使得在复杂的应用场景下,数据操作更加安全可靠。正确理解和应用事务处理,对于构建高质量的数据库应用至关重要。
- 使用Hibernate,可以通过统一的API(如Session)进行数据库操作,避免了因直接使用JDBC导致的代码不一致性和重复性,提高了代码的可维护性。 6. **Hibernate的功能扩展** - Hibernate提供了对象关系映射(O/R ...
**Struts2** 是一个强大的MVC框架,主要负责处理用户请求和控制业务流程。它提供了丰富的拦截器(Interceptor)机制,支持多种视图技术,并且能够与各种模板引擎如FreeMarker、JSP等无缝集成。Struts2的核心配置文件...
- **用途**:确保SQL语句的正确性和高效性,通常Hibernate能根据JDBC元数据自动识别。 ##### 2. hibernate.show_sql - **功能**:控制是否在控制台或日志中显示执行的SQL语句。 - **取值**:`true`或`false`,默认...
例如,Spring可以作为全局的事务管理器,统一管理Struts和Hibernate中的事务;而Hibernate作为数据访问层,负责数据库交互;Struts或SpringMVC则负责处理用户请求,展示视图,实现业务逻辑。 在学习这三个框架时,...
3. 配置简化:Spring可以统一管理Hibernate的SessionFactory和Session,简化配置文件。 4. AOP集成:Spring的AOP可以与Hibernate的事务管理结合,提供更灵活的事务策略。 四、整合步骤 1. 引入依赖:在项目中添加...
Hibernate的懒加载、缓存策略以及事务管理等高级特性,使得它能高效地与关系型数据库进行交互,满足现代应用程序对数据持久化的需求。 北京动力节点教育培训公司提供的Hibernate5讲义,不仅对Hibernate框架进行了...
3. **JTA(Java Transaction API)**:在分布式环境中处理事务是必要的,JTA提供了统一的事务管理。Hibernate支持JTA事务管理,因此在需要时,需要引入对应的JTA实现,如Jboss Transactions或Atomikos。 4. **SLF4J...
- **简化数据访问层**:Hibernate封装了JDBC,减少了很多重复的数据库操作代码。 - **ORM(对象关系映射)**:提供了对象和数据库表之间的映射,使开发者可以使用面向对象的方式来操作数据库。 - **反射机制**:利用...
总的来说,Spring和Hibernate的整合旨在提供一个统一的、可扩展的开发环境,使得开发者可以更专注于业务逻辑,而不是底层的数据库操作和事务管理。通过合理配置和设计,这种整合可以提高开发效率,增强系统的可维护...
Spring的事务管理可以无缝地与Hibernate结合,提供统一的事务边界控制,使得事务管理变得更加简洁和高效。 #### 四、构建事务持久层 在实际应用中,通过Spring来管理Hibernate的SessionFactory,并利用Spring的...
JDBC 更侧重于底层控制和性能,而 Hibernate 提供了更高的抽象级别,使得数据库操作更加简单直观。根据项目的具体需求,合理选择使用 Hibernate 或 JDBC,可以帮助开发者高效地完成数据库相关的开发工作。
4. **JDBC事务管理** - 自动提交:默认情况下,JDBC每条SQL语句都会开启一个事务并自动提交。可通过`Connection.setAutoCommit(false)`关闭自动提交,手动控制事务。 - 显式事务:通过`Connection.commit()`和`...
3. **事务管理**:Hibernate支持JTA(Java Transaction API)和JDBC事务管理。事务控制对于保证数据的一致性和完整性至关重要。 4. **Criteria和HQL查询**:除了传统的SQL查询,Hibernate提供了Criteria查询和HQL...