2009-04-16 5 views
11

스프링 프레임 워크는 트랜잭션 처리와 어느 정도 거리가 있습니까? "Session in Spring"책을 읽은 필자는 세션 팩토리와 트랜잭션 템플릿을 XML로 설정하고 DAO에 연결함으로써 세션 및 트랜잭션 관리에 대해 걱정하지 않는 DAO 메서드를 만드는 예제를 제안합니다. SpringSource.org의 문서는 다른 한편으로는이를 가능하게하는 XML 및/또는 주석이 필요하다는 것을 암시합니다. 여기 진실, 나는스프링을 이용한 자동 최대 절전 트랜잭션 관리?

get session from sessionfactory 
open transaction 
preform database actions 
commit transaction with error handling 

의 라인을 따라 코드를 가지고 그냥

preform database actions 

보일러 플레이트 트랜잭션 코드의 양을 감소 할 수있는 간단한 방법이 무엇인지가 무엇

그 나는 내 방법을 가로 질러 최소한이야?

답변

10

봄은 트랜잭션 경계의 적어도 3 가지 방법을 제공합니다

1) 프로그래밍 처리, TransactionTemplate의 또는 PlatformTransactionManager를 통해 - 설정에 빛하지만를 침략 XML을 통해 선언적

2) - 자세한 XML,하지만 비 침략

3) 주석을 통해 선언 - XML ​​빛, 침입하지 일에 가장 적합한 요구 사항이, 봄이 당신을 위해 선택을하지 않는 당신이 따라 선택 하나

. 귀하의 질문에서, 당신이 쫓고있는 주석 접근법처럼 들립니다.

주석 기반 트랜잭션 처리 섹션 인 Spring 참조 설명서를 읽는 것이 좋습니다. 그것은 명확하고 간결합니다.

언제나 먼저 ref 문서를 참조하고 문서에없는 경우에만 책을 참조하십시오.

11

당신이해야 할 일이 있습니다.하지만 그렇게할만한 것은 아닙니다. 아마도 JPA를 사용하여 자신의 공급자를 선택해야합니다. 최대 절전 모드. 그것은이 포함되어 있어야합니다 최소한

<?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 애플리케이션 컨텍스트에서 데이터베이스 연결에 필요한 모든 것을 정의 : 그럼 당신은 META-INF 폴더에 퍼시스턴스 유닛을 정의 persistence.xml을 배치해야합니다 :

<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를위한 것입니다.

이제 당신은 단순히 같은 데이터 액세스 방법을 정의 할 수 있습니다

사용자가 응용 프로그램에 의해 정의 된 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); 
    } 
} 

. 관리자/컨트롤러 레이어에서 DAO를 호출하는 트랜잭션을 관리 할 수 ​​있습니다. 실제로는 그렇게합니다.하지만 예제를 너무 많이 혼란스럽게하지 않기 위해 함께 배치했습니다. 내 예를 직선으로 대신 이동 할 수 있습니다

니스 참조는 참조뿐만 아니라가는 가치가 http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html 상위 3 링크입니다.

+0

답변을 주셔서 감사 드리며, 내일은이 회사에서 일하게 될 것입니다. 그러나 마지막 두 링크는 ​​동일합니다. –

+0

죄송하지만, 제가 제공 한 링크에는 내가 염두에 둔 다른 링크를 포함하여 3 개의 링크가 더 있습니다 ... – topchef

+0

이제 링크가 다운 된 것처럼 보입니다 ... –

관련 문제