web-dev-qa-db-fra.com

Quelle est l'utilisation de @TransActional avec jpa et hibernate?

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?

7
user9608350

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 @Transactionaltout 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.

7

@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:

  1. Nous réduisons un compte d'un 100 $
  2. Nous ajoutons 100 $ au compte de B

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.

6
Pijotrek

Se familiariser avec @Transactional Annotation en général, veuillez jeter un coup d'œil à ceci article. Pour creuser plus profondément, veuillez vous référer à Spring Docs .

0
Kamil W