В чем разница между сеансом и транзакцией в JPA 2.0? - PullRequest
36 голосов
/ 23 марта 2011

Я только начал изучать JPA 2.0, и у меня есть этот код:

em = SessionFactory.startSession();
tx = em.getTransaction();

Моя проблема: я не уверен, полностью ли я понимаю разницу между использованием сеанса и использованием транзакции. В нескольких строках, кто-нибудь может сказать мне самые большие различия между ними? Спасибо!

Ответы [ 4 ]

104 голосов
/ 23 марта 2011

Вы идете в банк, чтобы внести 2 чека и снять небольшую сумму.

Таким образом, вы стоите в очереди, пока не откроется кассир.

Вы делаете свой первый депозит.
Затем ваш второй.
Затем вы делаете вывод.

Теперь все готово, вы покидаете кассирскую линию.

Добраться до кассира - все равно что создать сеанс, теперь вынаходясь в банке, готовый к работе.

Каждый депозит и вывод средств - это отдельный набор работы, это ваши транзакции.

Когда вы закончите свою работу и уйдете, вызакрываете или прекращаете сеанс.


Итак, по сути, сеанс содержит ваши транзакции, ведь вы не можете сделать банковский депозит, если никогда не обращаетесь в банк, верно?

10 голосов
/ 23 марта 2011
em = SessionFactory.startSession();

В JPA нет ни Session, ни SessionFactory.SessionFactory - это специфичный для hibernate интерфейс, который не следует использовать, если вы используете JPA (используйте собственный API Hibernate или Hibernate в качестве провайдера JPA, но не оба).

5 голосов
/ 23 марта 2011

Сессия - это то, что вы используете для взаимодействия с базой данных.

Транзакция используется для указания границ сеанса для работы в пределах.

По сути, транзакции предотвращают повреждение базы данных, позволяя сеансу взаимодействовать с ней только один раз. (Это немного сложнее, так как вы можете иметь много транзакций, читающих из базы данных, но только одну транзакцию, которая записывает.)

3 голосов
/ 13 июня 2015

В Hibernate управление транзакциями достаточно стандартное, просто помните, что любые исключения, генерируемые Hibernate, являются ФАТАЛЬНЫМИ, вам необходимо откатить транзакцию и немедленно закрыть текущий сеанс.1003 *

    Session session = null;
    Transaction tx = null;

    try{
        session = HibernateUtil.getSessionFactory().openSession();
        tx = session.beginTransaction();
        tx.setTimeout(5);

        //doSomething(session);

        tx.commit();


    }catch(RuntimeException e){
        try{
            tx.rollback();
        }catch(RuntimeException rbe){
            log.error("Couldn’t roll back transaction", rbe);
        }
        throw e;
    }finally{
        if(session!=null){
            session.close();
        }
    }
...