• 技术文章 >Java >java教程

    Java事务管理学习之Spring和Hibernate的代码详解

    黄舟黄舟2017-03-27 10:25:17原创880
    这篇文章主要给大家介绍了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事务管理学习之Spring和Hibernate的代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:详解java图形验证码生成工具类web页面校验验证码的代码案例 下一篇:Java事务管理学习之Hibernate详细介绍
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网