2009-04-16 10 views
11

Jusqu'où va le cadre de ressorts avec le traitement des transactions? Ma lecture du livre "Spring In Action" suggestions avec ses exemples que vous créez des méthodes DAO qui ne s'inquiètent pas de la gestion de Session et Transaction assez simplement en configurant une usine de session et un modèle de transaction en XML, puis les câbler dans votre DAO. D'autre part, la documentation de SpringSource.org suggère que des tonnes de XML et/ou d'annotations sont nécessaires pour que cela se produise.Gestion automatique des transactions Hibernate avec Spring?

Quelle est la vérité ici, quelle est la façon la plus simple que je peux prendre le code le long des lignes de

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

et de le rendre juste

preform database actions 

réduire la quantité de code transactionnel de plaque de chaudière J'ai à travers mes méthodes au minimum?

Répondre

10

Spring fournit au moins 3 façons de démarcation de transaction:

1) la manipulation Programmatic, via TransactionTemplate ou PlatformTransactionManager - lumière sur config, mais invasive

2) déclarative via XML - XML ​​verbeux, mais non invasive

3) déclarative via annotations - la lumière sur XML, non invasive

lequel vous choisissez dépend de répond le mieux à vos besoins, printemps ne fait pas ce choix pour vous . De votre question, il semble que l'approche d'annotation est ce que vous recherchez.

Je suggère de lire le manuel de référence de Spring, la section traitant de la gestion des transactions basée sur les annotations. C'est clair et concis.

Je consulte toujours les documents ref en premier, et je ne consulte un livre que s'il n'est pas dans les docs.

11

Il y a du travail que vous êtes censé faire pour être capable de faire exactement cela, mais ce n'est pas grand chose. Supposément, vous utiliserez JPA avec votre propre fournisseur, par exemple. Hiberner. Ensuite, vous devez placer persistence.xml qui définit l'unité de persistance dans le dossier 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> 

Ensuite, définir tout le nécessaire pour la connexion de base de données dans le contexte d'application Spring que vous utilisez, au minimum, il doit contenir celles-ci:

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

Certaines propriétés ci-dessus peuvent être modifiées ou ajoutées en fonction de vos besoins. L'exemple est pour JPA avec la base de données Hibernate et PostgreSQL comme vous l'avez deviné.

Maintenant, vous pouvez simplement définir vos méthodes d'accès aux données comme ceci:

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

où l'utilisateur est une entité JPA définie par votre application. Vous pouvez gérer les transactions au niveau de la couche gestionnaire/contrôleur qui appelle vos DAO - en fait, je le fais de cette façon - mais je l'ai placé ici pour ne pas trop encombrer l'exemple.

références de Nice que vous pouvez aller directement à la place de mes exemples est http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html Les 3 liens haut il fait référence sont la peine d'aller aussi bien.

+0

Merci pour la réponse, je vais jouer avec ça demain au travail. Cependant, vos deux liens à la fin sont les mêmes. –

+0

désolé, mais le lien que j'ai fourni contient 3 liens de plus dont l'autre que j'avais en tête ... – topchef

+0

Maintenant, le lien semble être en panne ... –