В чем разница между сеансом и транзакцией в 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();
}
}