J'apprends comment créer REST API avec JPA et Hibernate et une base de données MySQL et je vois cette annotation @TransActional. Peut-on expliquer quelle est l'utilisation de cette annotation?
Par exemple, j'ai cette classe DAO simple:
@Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO {
// define field for entitymanager
private EntityManager entityManager;
// set up constructor injection
@Autowired
public EmployeeDAOHibernateImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
@Transactional
public List<Employee> findAll() {
// get the current hibernate session
Session currentSession = entityManager.unwrap(Session.class);
// create a query
Query<Employee> theQuery =
currentSession.createQuery("from Employee", Employee.class);
// execute query and get result list
List<Employee> employees = theQuery.getResultList();
// return the results
return employees;
}
}
Vous pouvez voir la méthode @TransAderalal utilisée pour la méthode Findallall (), mais si je supprime ce @TransAderal, je reçois la même sortie ... alors quelle est l'utilisation de ce @TransActional?
Généralement le @Transactional
L'annotation est écrite au niveau du service.
Il est utilisé pour combiner plus d'une écriture sur une base de données comme une seule opération atomique.
Quand quelqu'un appelle la méthode annotée avec @Transactional
tout ou rien de l'écriture sur la base de données est exécuté.
Dans le cas des opérations de lecture, il n'est pas utile et il est donc en cas d'une seule écriture atomique. Vous l'utilisez en une seule lecture (sélectionnez) afin d'ajouter ou de supprimer le @Transactional
Annotation n'a aucun impact.
@Transactional
L'annotation est utilisée lorsque vous souhaitez que la méthode/classe (= toutes les méthodes à l'intérieur) soit exécutée dans une transaction.
Supposons que l'utilisateur A
veut transférer 100 $ à l'utilisateur B
. Ce qui se produit est:
Supposons que l'exception soit lancée après avoir succédé 1)
et avant d'exécuter 2)
. Maintenant, nous aurions une sorte d'incohérence parce que A
perdu 100 $ _ B
n'a rien. Transactions signifie tout ou rien. S'il y a une exception projetée quelque part dans la méthode, les modifications ne sont pas persistées dans la base de données. Quelque chose appelé rollback
arrive.
Si vous ne spécifiez pas @Transactional
, chaque appel de DB sera dans une transaction différente.