2009-04-16 21 views
11

¿Qué distancia tiene el marco de resorte con el manejo de transacciones? Mi lectura de las sugerencias del libro "Primavera en acción" con ejemplos de que crea métodos DAO que no se preocupan por la gestión de sesiones y transacciones de manera sencilla simplemente configurando una plantilla de fábrica y transacción de sesión en XML y luego conectándolas a su DAO. La documentación de SpringSource.org, por otro lado, sugiere que se necesitan toneladas de XML y/o anotaciones para que esto suceda.Gestión automática de transacciones de Hibernate con Spring?

¿Cuál es la verdad aquí, ¿cuál es la forma más sencilla que puede tomar el código en la línea de

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

y hacerlo simplemente

preform database actions 

reducir la cantidad de placa de la caldera código de transacción que de Tengo mis métodos al mínimo?

Respuesta

10

Spring proporciona al menos 3 formas de demarcación de transacciones:

1) la manipulación programático, a través de TransactionTemplate o PlatformTransactionManager - luz sobre config, pero invasiva

2) declarativa a través de XML - XML ​​detallado, pero no invasivo

3) declarativa a través de anotaciones - luz sobre XML, no invasivo

la que elijas depende de lo que uno mejor se adapte a sus necesidades, la primavera no hacen que la opción para usted . A partir de tu pregunta, parece que el enfoque de anotación es lo que buscas.

Sugiero leer el manual de referencia de Spring, la sección de gestión de transacciones basada en anotaciones. Es claro y conciso.

Siempre consulto los documentos de referencia primero, y solo consulto un libro si no está en los documentos.

11

Se supone que debe hacer algo para poder hacer eso, pero no es mucho. Supuestamente, usará JPA para elegir su propio proveedor, p. Hibernar. Luego hay que colocar persistence.xml que define la unidad de persistencia en la carpeta 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> 

A continuación, defina todo lo necesario para la conexión de base de datos en el contexto de aplicación de primavera que utiliza, como mínimo, debe contener los siguientes:

<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"/> 

Algunas propiedades arriba pueden ser modificadas o agregadas dependiendo de sus necesidades. El ejemplo es para JPA con la base de datos Hibernate y PostgreSQL como ya habrás adivinado.

Ahora simplemente puede definir sus métodos de acceso de datos como esta:

@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); 
    } 
} 

donde usuario es una entidad JPA definido por la aplicación. Puede gestionar transacciones en la capa de administrador/controlador que llama a sus DAO, de hecho lo hago de esa manera, pero lo puse aquí para no complicar mucho el ejemplo.

referencias agradable que es posible que desee ir directamente al lugar de mis ejemplos es http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html los 3 primeros enlaces son los que hace referencia la pena ir también.

+0

Gracias por la respuesta, jugaré con esto mañana en el trabajo. Sin embargo, ambos enlaces al final son los mismos. –

+0

lo siento, pero el enlace que proporcioné contiene 3 enlaces más, incluido el otro que tenía en mente ... – topchef

+0

Ahora parece que el enlace está abajo ... –

Cuestiones relacionadas