Spring을 이용한 자동 Hibernate 트랜잭션 관리?
-
09-09-2019 - |
문제
Spring 프레임워크는 트랜잭션 처리와 얼마나 관련이 있나요?"Spring In Action"이라는 책에서 읽은 내용에 따르면 세션 팩토리와 트랜잭션 템플릿을 XML로 설정한 다음 이를 DAO에 연결함으로써 세션 및 트랜잭션 관리에 대해 걱정하지 않는 DAO 메서드를 생성할 수 있다는 제안이 나와 있습니다.반면에 SpringSource.org의 문서에서는 이를 실현하려면 엄청난 양의 XML 및/또는 주석이 필요하다고 제안합니다.
여기서 진실은 무엇이며, 다음과 같이 코드를 작성할 수 있는 가장 간단한 방법은 무엇입니까?
get session from sessionfactory
open transaction
preform database actions
commit transaction with error handling
그리고 그냥 만들어
preform database actions
내 메서드 전반에 걸쳐 사용되는 상용구 트랜잭션 코드의 양을 최소한으로 줄이려고 합니까?
해결책
Spring은 최소한 3 가지 거래 방법을 제공합니다.
1) TransactionTemplate 또는 PlatformTransactionManager를 통한 프로그래밍 방식 처리 - 구성의 조명이지만 침습적
2) XML을 통한 선언 - Verbose XML이지만 비 침습적
3) 주석을 통한 선언 - 침습적이 아닌 XML의 빛
당신이 선택하는 것을 선택하는 것은 당신의 요구에 가장 적합한 사람에 달려 있습니다. Spring은 당신을 위해 그 선택을하지 않습니다. 당신의 질문에서, 그것은 주석 접근법이 당신이 추구하는 것처럼 들립니다.
주석 중심 거래 처리 섹션 인 Spring Reference 매뉴얼을 읽는 것이 좋습니다. 명확하고 간결합니다.
나는 항상 Ref Docs를 먼저 상담하고 문서에없는 경우에만 책을 참조하십시오.
다른 팁
그렇게 하려면 해야 할 일이 몇 가지 있지만 전혀 많지 않습니다.아마도 JPA를 사용하여 자신의 공급자를 선택할 것입니다.최대 절전 모드.그런 다음 META-INF 폴더에 지속성 단위를 정의하는 persistence.xml을 배치해야 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>
</persistence>
다음으로, 사용하는 Spring 애플리케이션 컨텍스트에서 데이터베이스 연결에 필요한 모든 것을 정의합니다. 최소한 다음을 포함해야 합니다.
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" scope="singleton">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="showSql" value="true"/>
<property name="generateDdl" value="false"/>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
위의 일부 속성은 필요에 따라 변경되거나 추가될 수 있습니다.이 예는 짐작할 수 있듯이 Hibernate 및 PostgreSQL 데이터베이스를 사용하는 JPA에 대한 것입니다.
이제 다음과 같이 간단하게 데이터 액세스 방법을 정의할 수 있습니다.
@Repository
@Transactional
public class UserJpaDAO {
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void save(User theUser) {
entityManager.persist(theUser);
}
public User update(User theUser) {
return entityManager.merge(theUser);
}
}
여기서 User는 애플리케이션에서 정의한 JPA 엔터티입니다.DAO를 호출하는 관리자/컨트롤러 계층에서 트랜잭션을 관리할 수 있습니다. 실제로 저는 그렇게 합니다. 그러나 예제를 너무 복잡하게 만들지 않기 위해 여기에 함께 배치했습니다.
내 예제 대신 바로 보고 싶을 만한 좋은 참고 자료는 다음과 같습니다.http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html참조되는 상위 3개 링크도 방문할 가치가 있습니다.