2010-08-18 4 views
4

Je suis un nouveau venu. J'utilise l'annotation @Transactional pour mes méthodes dao:Printemps @ Emballage transactionnel 2 méthodes

@Transactional 
public Person getById(long id) { 
    return new Person(jdbcTemplate.queryForMap(...)); 
} 

@Transactional 
public void save(Person person) { 
    jdbcTemplate.update(...); 
} 

et je l'ai mis en place le gestionnaire de transactions comme celui-ci:

<tx:annotation-driven transaction-manager="txManager" /> 
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

Le problème est que lorsque mon code client appelle dao.save(..) puis dao.getById(4) Ceux-ci se produisent dans deux transactions distinctes. Comment est-il possible d'emballer ces 2 appels dans la même transaction de base de données? Idéalement, sans le faire d'une manière programmatique.

grâce

Répondre

4
@Transactional(propagation = REQUIRES_NEW, readOnly = false) 
public Person saveAndGetById(Person person, long id) { 
    save(person); 
    return getById(id); 
} 

@Transactional(propagation = REQUIRED) 
public Person getById(long id) { 
    return new Person(jdbcTemplate.queryForMap(...)); 
} 

@Transactional(propagation = REQUIRED, readOnly = false) 
public void save(Person person) { 
    jdbcTemplate.update(...); 
} 

Cependant, la meilleure chose serait d'avoir la méthode « enregistrer » retourner une carte d'identité, car il est difficile de savoir à l'avance quel ID la personne aura une fois persisté.

+0

Merci. Le getById était juste un exemple. – cherouvim

4

bonnes pratiques dans ce cas serait MARQUAGE méthode de service qui invoque ces deux méthodes de DAO comme @Transactional. Le cas a été clairement discuté here.

5

La mise en place d'attributs transactionnels dans une couche DAO est une mauvaise pratique. Aussi, je ne sais pas pourquoi vous avez besoin de transaction pour la méthode getById. Même si vous voulez utiliser la transaction, vous devez spécifier le comportement de propagation comme REQUIRES_NEW pour la méthode save et getById.