est-il un moyen de forcer les opérations de restauration sans rencontrer une exception?
J'ai une méthode qui fait un tas de choses; parmi eux, de faire un certain nombre d'insertions et mises à jour. Elle est déclarée à l'thusly...
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public int saveAll(){
//do stuff;
}
Il fonctionne exactement comme il est censé faire, et je n'ai pas de problèmes avec elle. Il y a des cas, cependant quand je veux de la force de la restauration, en dépit de ne pas être une exception... pour le moment, je suis en forçant une exception lorsque je rencontre les bonnes conditions, mais c'est moche et je n'aime pas ça.
Peut je contribue activement à l'appel de la restauration en quelque sorte? L'exception appelle... je pense peut-être que je peut trop.
- vérifier static.springsource.org/spring/docs/2.0.x/reference/... section 9.5.3
Vous devez vous connecter pour publier un commentaire.
Au Printemps Transactions, vous utilisez
TransactionStatus.setRollbackOnly()
.Le problème que vous avez ici est que vous utilisez
@Transactional
pour délimiter vos transactions. Cela a l'avantage d'être non invasive, mais cela signifie également que si vous souhaitez manuellement interagir avec le contexte de transaction, vous ne pouvez pas.Si vous voulez un contrôle serré de votre statut de la transaction, vous devez utiliser programmatique transactions plutôt que déclarative des annotations. Cela signifie en utilisant le Printemps TransactionTemplate, ou d'utiliser ses PlatformTransactionManager directement. Voir la section 9.6 du Printemps manuel de référence.
Avec
TransactionTemplate
, vous fournir un rappel de l'objet qui implémenteTransactionCallback
, et le code de cette fonction de rappel a accès à laTransactionStatus
objets.C'est pas aussi beau que
@Transactional
, mais vous vous rapprochez de contrôle de votre tx état.TransactionInterceptor.currentTransactionStatus().setRollbackOnly()
être un moyen de le faire manuellement en interaction avec la transaction au moyen d'une méthode qui utilise@Transactional
? Principalement pour le remplacement de lasetRollbackOnly
les méthodes d'EJB. Serais intéressé si vous avez un commentaire à faire sur ce. Merci!Nous n'utilisons pas d'EJB, mais de simples Printemps et nous avons choisi la démarche AOP.
Nous avons mis en œuvre la nouvelle annotation
@TransactionalWithRollback
et AOP utilisé pour envelopper ces méthodes annotées avec "autour de" conseils. Pour mettre en œuvre les conseils que nous leur utilisation, comme mentionnéTransactionTemplate
. Cela signifie un peu de travail au début, mais comme un résultat, nous pouvons seulement d'annoter une méthode avec@TransactionalWithRollback
comme nous utilisons@Transactional
dans les autres cas. Le code principal aspect propre et simple.Appel
setRollbackOnly()
sur leSessionContext
si vous êtes dans un EJB.Vous pouvez injecter
SessionContext
comme suit:setRollbackOnly()
est un membre deEJBContext
.SessionContext
s'étendEJBContext
:http://java.sun.com/j2ee/1.4/docs/api/javax/ejb/SessionContext.html Remarque il est uniquement disponible dans la session Ejb.
@Resource
est un standard Java EE annotation, de sorte que vous devriez vérifier votre configuration dans Eclipse. Voici un exemple de comment injecter le SessionContext à l'aide de@Resource
.Je soupçonne que ce n'est probablement pas votre solution, car il semble que vous ne pouvez pas travailler avec les Ejb -- expliquer pourquoi Eclipse n'est pas de trouver
@Resource
.Si c'est le cas, alors vous aurez besoin d'interagir avec la transaction directement-voir le modèle de transaction.
Cela fonctionne pour moi:
Vous devriez avoir le printemps injecter le gestionnaire transactionnel. Ensuite, vous pouvez simplement appeler la méthode de retour en arrière sur elle.
J'ai de service méthodes annotées avec
@Transactional
. Si la validation échoue, et j'ai déjà une entité attachée à l'unité de travail, j'utilisesessionFactory.getCurrentSession().evict(entity)
à assurez-vous que rien n'est écrit dans la base de données. De cette façon, je n'ai pas besoin de lever une exception.Oui nous pouvons forcer la restauration tout en utilisant @Transactionnelle (niveau de classe) sans rencontrer une exception. Nous pouvons simplement lever une exception (tout en un). Comme
Lever une exception et d'utiliser le cadre comme prévu, autrement, ne pas utiliser déclarative des transactions de gestion et de suivi skaffman conseiller ci-dessus. Garder les choses simples.