2009-04-16 94 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

相关问题