>  기사  >  Java  >  Java 트랜잭션 관리 학습을 위한 Spring 및 Hibernate의 자세한 코드 설명

Java 트랜잭션 관리 학습을 위한 Spring 및 Hibernate의 자세한 코드 설명

黄舟
黄舟원래의
2017-03-27 10:25:171914검색

이번 글에서는 Java 트랜잭션 관리 학습을 위한 Spring과 Hibernate 관련 정보를 주로 소개하고 있는데, 샘플 코드를 통해 자세히 소개하고 있으니, 필요하신 분들은 참고해 보세요.

환경 및 버전

이 기사가 나오기 전 기사에 hibernate 관련 libs 외에

Java 트랜잭션 관리를 위한 Hibernate

spring lib 패키지와 다음 종속성 패키지도 추가해야 합니다

org.aopalliance

org.aspectj

org.apache.commons

Spring 버전은 Spring 4.1.5입니다.

종속성 패키지는 Spring 공식 웹사이트에서도 spring-framework-3.0.2.RELEASE-종속성과 유사한 이름으로 다운로드할 수 있습니다.

이론적 지식

Spring과 Hibernate를 통합한 후 Hibernate API를 통해 데이터베이스 작업을 수행할 때 opensession, close, startTransaction, 커밋은 매번 반복되는 작업이므로 트랜잭션 관리 부분은 스프링 프레임워크에 맡길 수 있습니다.

spring을 사용하여 트랜잭션을 관리한 후에는 더 이상 dao에서 startTransaction 및 커밋을 호출할 필요가 없으며 session.close()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 모드 구성 트랜잭션 코드 예시
코드 구성은 다음과 같습니다.

Java 트랜잭션 관리 학습을 위한 Spring 및 Hibernate의 자세한 코드 설명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에는 트랜잭션이 필요하지 않습니다


삽입이나 업데이트가 없으면 업데이트가 성공하지 못합니다

선언적 구성 트랜잭션 필요 xml 구성에서 설정

3832b7f60b35c979934ab8147f86b2bd
Thing 주석 메서드: @Transactional


클래스 앞에 표시하면 표시된 클래스의 모든 메서드가 트랜잭션 처리를 수행합니다. 다음 코드는 서비스 계층에서 수행됩니다. 트랜잭션 처리(서비스 계층 메서드 작업이 여러 DAO 작업과 연결될 수 있으므로 서비스 계층에 대한 트랜잭션을 구성하는 더 좋은 방법입니다. 이러한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.