В чем разница между сеансом и транзакцией в JPA 2.0?

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

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

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

Ответ 1

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

Итак, вы стоите в очереди, пока не откроется кассир.

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

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

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

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

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


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

Ответ 2

em = SessionFactory.startSession();

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

Ответ 3

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

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

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

Ответ 4

В Hibernate управление транзакциями является довольно стандартным, просто помните, что все исключения, сгенерированные Hibernate, являются FATAL, вам необходимо отменить транзакцию и немедленно закрыть текущий сеанс.

Вот шаблон транзакции Hibernate:

    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();
        }
    }