2009-04-16 95 views
11

Spring框架在事務處理的時候有多遠?我通過其示例創建DAO方法,不用擔心會話和事務管理,只需在XML中設置會話工廠和事務模板,然後將它們連接到您的DAO中,即可閱讀「Spring In Action」建議。另一方面,SpringSource.org的文檔表明,需要大量的XML和/或註釋來實現這一點。使用Spring自動Hibernate事務管理?

什麼是這裏的真理,什麼是我可以把代碼一起的

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

的線條,使它只

preform database actions 

減少鍋爐板交易代碼量的最簡單方式我已經把我的方法降到最低了?

回答

10

Spring提供至少3種方式的事務劃分的:

1)程序化的處理,經由TransactionTemplate的或的PlatformTransactionManager - 上配置光,但侵入

2)通過XML聲明 - 冗長的XML,但非微創

3)通過註釋聲明 - XML的光,不侵入

你選擇哪一個取決於哪一個最適合您的需求,Spring不會作出這樣的選擇。 。從你的問題來看,這聽起來像註釋方法是你所追求的。

我建議閱讀Spring參考手冊,註釋驅動的事務處理部分。它清晰簡潔。

我總是先諮詢參考文檔,如果它不在文檔中,只能諮詢一本書。

11

你應該做一些工作才能做到這一點,但它根本沒有多少。假設您將使用JPA挑選自己的提供者,例如休眠。然後,你需要放置的persistence.xml定義在META-INF文件夾中的持久化單元:

<?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名的鏈接引用它是值得去爲好。

+0

感謝您的回答,我明天將在工作中與此玩。但是,最後你的兩個鏈接都是一樣的。 – 2009-04-16 23:39:16

相關問題