이번 글에서는 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>
<property name="hibernate.current_session_context_class">jta</property>
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에는 트랜잭션이 필요하지 않습니다
삽입이나 업데이트가 없으면 업데이트가 성공하지 못합니다
선언적 구성 트랜잭션 필요 xml 구성에서 설정
<tx:annotation-driven transaction-manager="transactionManager">
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!