环境与版本

本文出来之前的一篇文章中的hibernate的相关lib 外
Java事务管理之Hibernate
还需要加入spring的lib 包和如下的一些依赖包
org.aopalliance
org.aspectj
org.apache.commons
Spring 的版本是Spring 4.1.5。
依赖包也可以到Spring 官方网站下载到 ,名字类似 spring-framework-3.0.2.RELEASE-dependencies
理论知识
Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成。
使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close() ,使用API sessionFactory.getCurrentSession()来替代sessionFactory.openSession()
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
Spring中Propagation类的事务属性详解:
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
Spring 可以使用xml方式进行配置或是使用注解声明的方式进行事务的管理。
xml 方式配置事务代码实例
代码结构如下:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:component-scan base-package="com.oscar999.trans.sprhib" />
<context:property-placeholder location="classpath:/com/oscar999/trans/sprhib/config.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
<prop key="jdbc.use_streams_for_binary">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.oscar999.trans.sprhib.model</value>
</list>
</property>
</bean>
<!-- Transaction -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
<aop:pointcut expression="execution(* com.oscar999.trans.sprhib.dao.ProductDAOImpl.*(..))" id="pointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>
</beans>
config.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@12.6.18.43:1521:orcl jdbc.username= jdbc.password=oracle
Product.Java
/**
* @Title: Product.java
* @Package com.oscar999.trans.hibernate
* @Description:
* @author XM
* @date Feb 15, 2017 1:44:47 PM
* @version V1.0
*/
package com.oscar999.trans.sprhib.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author XM
*
*/
@Entity
@Table(name = "TEST_PRODUCT")
public class Product implements Serializable {
public Product() {
}
@Id
@Column(name = "ID")
private Integer id;
@Column(name = "NAME")
private String name;
@Column(name = "PRICE")
private String price;
private static final long serialVersionUID = 1L;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
ProductDAOImpl.java
/**
* @Title: ProductDAOImpl.java
* @Package com.oscar999.trans.sprhib
* @Description:
* @author XM
* @date Feb 15, 2017 4:15:09 PM
* @version V1.0
*/
package com.oscar999.trans.sprhib.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.oscar999.trans.sprhib.model.Product;
/**
* @author XM
*
*/
@Repository
public class ProductDAOImpl {
@Autowired
private SessionFactory sessionFactory;
public Product findProductById(int id) {
Session session = sessionFactory.getCurrentSession();
Product product = (Product) session.get(Product.class, id);
return product;
}
public Product saveProduct(Product product) {
Session session = sessionFactory.getCurrentSession();
session.save(product);
return product;
}
}
ProductServiceImpl.java
package com.oscar999.trans.sprhib;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oscar999.trans.sprhib.dao.ProductDAOImpl;
import com.oscar999.trans.sprhib.model.Product;
@Service
public class ProductServiceImpl {
@Autowired
private ProductDAOImpl productdao;
public void findProduct(int id) {
Product product = productdao.findProductById(id);
if (product != null) {
System.out.println(product.getName());
}
}
public void saveProduct() {
Product product = new Product();
product.setId(2);
product.setName("product2");
product.setPrice("price2");
productdao.saveProduct(product);
}
}
TestMain.java
/**
* @Title: TestMain.java
* @Package com.oscar999.trans.sprhib
* @Description:
* @author XM
* @date Feb 15, 2017 3:54:54 PM
* @version V1.0
*/
package com.oscar999.trans.sprhib;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author XM
*
*/
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/oscar999/trans/sprhib/applicationContext.xml");
ProductServiceImpl productService = applicationContext.getBean(ProductServiceImpl.class);
//productService.findProduct(1);
productService.saveProduct();
}
}
说明如下:
get 可以不需要transaction
插入或是更新如果没有的话, 就不会更新成功
声明方式配置事务
需要在xml配制中设置<tx:annotation-driven transaction-manager="transactionManager">
事物注解方式: @Transactional
当标于类前时,标示类中所有方法都进行事物处理,以下代码在service层进行事务处理(给Service层配置事务是比较好的方式,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。)
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public User getUserById(int id) {
return userDao.findUserById(id);
}
}
当类中某些方法不需要事物时:
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public User getUserById(int id) {
return userDao.findUserById(id);
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用java能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# java
# spring事务管理
# spring
# hibernate事务
# hibernate
# 事务
# Java Spring事务使用及验证过程详解
# Java Spring 事务回滚详解
# 深入解析Java的Spring框架中的混合事务与bean的区分
# 详解Java的Spring框架中的事务管理方式
# JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗
# 的是
# 不需要
# 抛出
# 新建一个
# 挂起
# 类中
# 这是
# 也不
# 都要
# 多个
# 我们可以
# 就把
# 如果没有
# 比较好
# 还需要
# 可以使用
# 这篇文章
# 谢谢大家
# 这些都是
# 就以
相关文章:
名字制作网站免费,所有小说网站的名字?
山东云建站价格为何差异显著?
Thinkphp 中 distinct 的用法解析
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作企业,网站的banner和导航栏是指什么?
清除minerd进程的简单方法
西安专业网站制作公司有哪些,陕西省建行官方网站?
,石家庄四十八中学官网?
如何通过远程VPS快速搭建个人网站?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机如何选?高性价比方案全解析
宝塔新建站点报错如何解决?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何快速生成ASP一键建站模板并优化安全性?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何用西部建站助手快速创建专业网站?
定制建站方案优化指南:企业官网开发与建站费用解析
济南网站制作的价格,历城一职专官方网站?
简历在线制作网站免费版,如何创建个人简历?
b2c电商网站制作流程,b2c水平综合的电商平台?
如何在香港服务器上快速搭建免备案网站?
如何在阿里云服务器自主搭建网站?
建站之星多图banner生成与模板自定义指南
如何快速登录WAP自助建站平台?
,怎么在广州志愿者网站注册?
如何通过西部建站助手安装IIS服务器?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何实现建站之星域名转发设置?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站之星Pro快速搭建教程:模板选择与功能配置指南
网站好制作吗知乎,网站开发好学吗?有什么技巧?
网站制作员失业,怎样查看自己网站的注册者?
建站主机数据库如何配置才能提升网站性能?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何通过免费商城建站系统源码自定义网站主题与功能?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
网站制作网站,深圳做网站哪家比较好?
测试制作网站有哪些,测试性取向的权威测试或者网站?
一键网站制作软件,义乌购一件代发流程?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何快速生成凡客建站的专业级图册?
建站之星备案是否影响网站上线时间?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
大同网页,大同瑞慈医院官网?
如何用5美元大硬盘VPS安全高效搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。