문제

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개 링크도 방문할 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top