Comment rollback transaction en JPA?
J'ai un EntityManager
objet maintenu par le framework Spring et j'injecte dans n'importe quelle classe DAO je veux à l'aide de la @PersistenceContext
annotation comme ça..
@PersistenceContext(unitName="entityManager")
private EntityManager em;
- Je utiliser ces classes DAO pour l'enregistrer dans la base de données de quelque chose comme ça..
class MyClass
{
@Resource(name="myDao")
private MyDao dao;
@Resource(name="myAnotherDao")
private MyAnotherDao anotherDao;
public void save(String s1,String s2)
{
try
{
MyEntity m=new MyEntity();
m.setName(s1);
//.. and so on ..
XYZ x=new XYZ();
x.setDEF(s2);
anotherDao.save(x);
m.setXYZ(x);
//.. some other stuff .. //
dao.saveEntity(m);
}
catch(Exception e)
{
//I would like to rollback the transaction
}
}
}
Le daos ici utiliser le même EntityManager
injecté par @PersistenceContext(unitName="entityManager")
. Maintenant, si une exception se produit après setXYZ()
, alors je voudrais reprendre la même enregistré XYZ
entité. Mais, comment puis-je obtenir le EntityManager
de qui?
Si tous les daos tenir le même objet, alors je peux juste d'appeler la getTransaction().rollback()
méthode de la EntityManager
classe? Le getTransaction()
retour une nouvelle transaction ou toute transaction qui est actuellement associé à EntityManager
?
Vous devez vous connecter pour publier un commentaire.
Si vous avez utilisé Spring AOP pour gérer les transactions, et de la configuration et de l'annotation est utilisé correctement, l'effet par défaut est l'opération serait annulée lorsque l'exception d'exécution se produit.
Si vous avez réussi opération manuellement, vous pouvez annuler la transaction comme ceci:
Voir plus à:
http://en.wikibooks.org/wiki/Java_Persistence/Transactions
http://www.developerscrappad.com/547/java/java-ee/ejb3-x-jpa-when-to-use-rollback-and-setrollbackonly/#sthash.jx3XlK5m.dpuf
Il sera de restauration une fois que vous jetez tout RuntimeException à partir d'une méthode marquée comme @Transactionnelle comme ci-dessous:
Par défaut, tous les RuntimeExceptions rollback transaction où, comme checked exceptions à ne pas faire:
Il suffit de ne pas attraper l'exception. Laissez bulle. Le printemps sera automatiquement annuler la transaction si une exception d'exécution est générée à partir d'une méthode d'appel. Et l'appelant ne sais au moins que quelque chose de mauvais se produire, au lieu de penser que tout s'est bien passé.
De toute façon, votre bloc catch ne sera probablement pas attraper quoi que ce soit, parce que la plupart des exceptions se produisent lors du flush et quinte principalement arrive juste avant de s'engager, dans le Ressort de la transaction de l'intercepteur. Rappelez-vous que la persistance d'une entité n'a pas d'exécuter une requête d'insertion immédiatement. Il dit juste Hibernate qui, avant la fin de la transaction, une insertion devra être exécuté.
unitName
pour l'EntityManager, je peux dire que les deux XYZ et MyEntity est enregistré dans la même transaction?@Transactional
, et sont gérés par un gestionnaire de transactions (en général, avec JPA, un JpaTransactionManager). Le printemps a tout un chapitre expliquant les transactions: docs.printemps.io/printemps-cadre/docs/4.1.x/....