Java事务管理学习之Spring和Hibernate详解
发布时间 - 2026-01-11 00:22:23 点击率:次环境与版本

本文出来之前的一篇文章中的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大事务问题要如何解决你知道吗
# 的是
# 不需要
# 抛出
# 新建一个
# 挂起
# 类中
# 这是
# 也不
# 都要
# 多个
# 我们可以
# 就把
# 如果没有
# 比较好
# 还需要
# 可以使用
# 这篇文章
# 谢谢大家
# 这些都是
# 就以
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
香港服务器WordPress建站指南:SEO优化与高效部署策略
米侠浏览器网页背景异常怎么办 米侠显示修复
郑州企业网站制作公司,郑州招聘网站有哪些?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何用y主机助手快速搭建网站?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
在centOS 7安装mysql 5.7的详细教程
如何快速上传建站程序避免常见错误?
Laravel如何实现用户密码重置功能?(完整流程代码)
如何快速启动建站代理加盟业务?
Python文本处理实践_日志清洗解析【指导】
如何在七牛云存储上搭建网站并设置自定义域名?
如何在IIS服务器上快速部署高效网站?
如何生成腾讯云建站专用兑换码?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
如何续费美橙建站之星域名及服务?
网站页面设计需要考虑到这些问题
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Linux网络带宽限制_tc配置实践解析【教程】
如何用搬瓦工VPS快速搭建个人网站?
如何用AWS免费套餐快速搭建高效网站?
微信小程序 闭包写法详细介绍
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
JavaScript Ajax实现异步通信
Laravel如何使用withoutEvents方法临时禁用模型事件
HTML 中动态设置元素 name 属性的正确语法详解
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Python进程池调度策略_任务分发说明【指导】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何实现本地化和多语言支持?(i18n教程)
如何做网站制作流程,*游戏网站怎么搭建?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel怎么为数据库表字段添加索引以优化查询
如何在建站之星绑定自定义域名?
香港服务器部署网站为何提示未备案?
Laravel如何为API生成Swagger或OpenAPI文档
如何彻底删除建站之星生成的Banner?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在Windows环境下新建FTP站点并设置权限?
专业商城网站制作公司有哪些,pi商城官网是哪个?
进行网站优化必须要坚持的四大原则
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
如何在香港免费服务器上快速搭建网站?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何用AI帮你把自己的生活经历写成一个有趣的故事?

