Java事务管理学习之Spring和Hibernate详解
环境与版本
本文出来中的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快速排序算法