- Spring初学快速入门
- 安装Spring工具套件到Eclipse
- Spring快速入门
- Spring自动装配Bean
- Spring JDBC支持
- Spring JavaConfig
- Spring 依赖注入(DI)
-
Spring Bean基础
- Spring Bean引用例子
- 如何注入值到Spring bean属性
- Spring bean加载多个配置文件
- Spring内部bean实例
- Spring Bean作用域实例
- Spring集合 (List,Set,Map,Properties) 实例
- Spring ListFactoryBean实例
- Spring SetFactoryBean实例
- Spring MapFactoryBean例子
- Spring注入日期到bean属性-CustomDateEditor
- Spring PropertyPlaceholderConfigurer实例
- Spring bean配置继承
- Spring依赖检查
- Spring使用@Required注解依赖检查
- Spring自定义@Required-style注解
- Spring Bean InitializingBean和DisposableBean实例
- Spring Bean init-method 和 destroy-method实例
- Spring @PostConstruct和@PreDestroy实例
- Spring表达式语言
- Spring自动组件扫描
- Spring AOP (面向方面编程)
- Spring AOP + AspectJ框架
- Spring Hibernate支持
- Spring E-mail支持
-
Spring与其它Web框架集成
Spring AOP在Hibernate事务管理
P.S 这里很多Hibernate和Spring配置文件是隐藏的,只有一些重要的文件显示,如果你想看全部文件,请在文章的结尾下载完整的项目代码。
1.创建表
CREATE TABLE `zyiz`.`product` ( `PRODUCT_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `PRODUCT_CODE` varchar(20) NOT NULL, `PRODUCT_DESC` varchar(255) NOT NULL, PRIMARY KEY (`PRODUCT_ID`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `zyiz`.`product_qoh` ( `QOH_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `PRODUCT_ID` bigint(20) unsigned NOT NULL, `QTY` int(10) unsigned NOT NULL, PRIMARY KEY (`QOH_ID`), KEY `FK_product_qoh_product_id` (`PRODUCT_ID`), CONSTRAINT `FK_product_qoh_product_id` FOREIGN KEY (`PRODUCT_ID`) REFERENCES `product` (`PRODUCT_ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.产品业务对象
package com.zyiz.product.bo.impl; import com.zyiz.product.bo.ProductBo; import com.zyiz.product.bo.ProductQohBo; import com.zyiz.product.dao.ProductDao; import com.zyiz.product.model.Product; import com.zyiz.product.model.ProductQoh; public class ProductBoImpl implements ProductBo{ ProductDao productDao; ProductQohBo productQohBo; public void setProductDao(ProductDao productDao) { this.productDao = productDao; } public void setProductQohBo(ProductQohBo productQohBo) { this.productQohBo = productQohBo; } //this method need to be transactional public void save(Product product, int qoh){ productDao.save(product); System.out.println("Product Inserted"); ProductQoh productQoh = new ProductQoh(); productQoh.setProductId(product.getProductId()); productQoh.setQty(qoh); productQohBo.save(productQoh); System.out.println("ProductQoh Inserted"); } }
<!-- Product business object --> <bean id="productBo" class="com.zyiz.product.bo.impl.ProductBoImpl" > <property name="productDao" ref="productDao" /> <property name="productQohBo" ref="productQohBo" /> </bean> <!-- Product Data Access Object --> <bean id="productDao" class="com.zyiz.product.dao.impl.ProductDaoImpl" > <property name="sessionFactory" ref="sessionFactory"></property> </bean>
运行它
Product product = new Product(); product.setProductCode("ABC"); product.setProductDesc("This is product ABC"); ProductBo productBo = (ProductBo)appContext.getBean("productBo"); productBo.save(product, 100);
假设save() 不具有事务功能,如果异常抛出由productQohBo.save(),钭只插入一条记录到“product”表,没有记录将被插入到“productQoh'表。这是一个严重的问题,在数据库中打破数据一致性。
3.事务管理
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="save">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="dataSource" ref="dataSource" /> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
事务属性
在事务拦截器,必须定义的事务的属性“传播行为”应使用。这意味着,如果一个事务“ProductBoImpl.save()方法被调用另外的”productQohBo.save()'方法,事务应该怎么传播?它能继续在现有的事务中运行?或者为自己开始一个新的事务。
- PROPAGATION_REQUIRED – 支持当前事务;如果不存在则创建一个新的。
- PROPAGATION_SUPPORTS – 支持当前事务;如果不存在执行非事务。
- PROPAGATION_MANDATORY – 支持当前事务;如果当前不存在事务抛出异常。
- PROPAGATION_REQUIRES_NEW – 创建一个新的事务,如果当前事务暂停。
- PROPAGATION_NOT_SUPPORTED – 不支持当前的事务;而始终执行非事务。
- PROPAGATION_NEVER – 不支持当前的事务;如果当前事务存在则抛出异常。
- PROPAGATION_NESTED – 如果当前存在事务嵌套事务中执行,表现与 PROPAGATION_REQUIRED 一样。
事务管理器
在Hibernate事务,需要使用 HibernateTransactionManager 。 如果只对付纯JDBC,useDataSourceTransactionManager; 而如果是 JTA,需要使用 JtaTransactionManager 。
4.代理工厂bean
<!-- Product business object --> <bean id="productBo" class="com.zyiz.product.bo.impl.ProductBoImpl" > <property name="productDao" ref="productDao" /> <property name="productQohBo" ref="productQohBo" /> </bean> <!-- Product Data Access Object --> <bean id="productDao" class="com.zyiz.product.dao.impl.ProductDaoImpl" > <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="productBoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="productBo" /> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean>
运行它
Product product = new Product(); product.setProductCode("ABC"); product.setProductDesc("This is product ABC"); ProductBo productBo = (ProductBo)appContext.getBean("productBoProxy"); productBo.save(product, 100);
参考
- Java教程
- Vim教程
- Swing教程
- Spring教程
- Spring Web Services教程
- Spring MVC教程
- Spring JDBC教程
- Spring Cloud教程
- Spring Boot教程
- Spring Boot CLI教程
- Spring Batch教程
- Spring AOP教程
- PDFBox教程
- JSP教程
- JSF教程
- JPA教程
- Java面向对象设计
- Java设计模式
- Java虚拟机教程
- Java泛型教程
- Java正则表达式教程
- Java数据类型教程
- Java并发编程教程
- Java密码学教程
- Java多线程教程
- Java国际化(i18n)教程
- JavaFX教程
- Java9教程
扫描二维码
程序员编程王