Использует ли hibernate jdbc для внутреннего использования или JTA для внутреннего использования или это настраивается? " - PullRequest
7 голосов
/ 17 сентября 2011

Я новичок в спящем режиме и начал изучать спящий режим. В этой главе я использую спящий режим с JDBC (). Мой первый вопрос Использует ли hibernate jdbc внутренне или JTA для выполнения операций сохранения и получения? Но я также вижу здесь некоторые упоминания о JTA, например, метод getCurrentSeessionSession () получает сеанс, связанный с текущей транзакцией JTA. Вопрос: - В основном я хочу понять роль JTA и jdbc здесь, в спящем режиме.

Вопрос2: - Ниже приведен фрагмент кода в любой операции в спящем режиме

try{ 
session=factory.openSession();
tx=session.beginTransaction();
session.save(myClass);
tx.commit();
}
finally{
session.close();
}

Здесь я хочу понять роль строки // tx = session.beginTransaction (); Согласно пониманию, каждый сеанс будет использовать одно соединение. Так даже если мы начнем несколько транзакций из одного сеанса, мы будем использовать одно и то же соединение. как только мы совершаем конкретную транзакцию все транзакции созданный из того же сеанса будет зафиксирован один раз. Итак, чего мы пытаемся достичь с помощью // tx = session.beginTransaction ();

1 Ответ

17 голосов
/ 17 сентября 2011

Использует ли hibernate jdbc внутренне или JTA для выполнения операций сохранения и получения?

JDBC и JTA не являются взаимозаменяемыми. JDBC - это стандартный API , который Java-приложения используют для взаимодействия с базой данных. JTA - это стандартный API для управления транзакциями через один или несколько ресурсов. Наиболее близким ответом на ваш вопрос будет то, что «внутри» Hibernate использует JDBC для взаимодействия с базой данных.

Как метод getCurrentSeessionSession () получает сеанс, связанный с текущей транзакцией JTA.

Не совсем. SessionFactory.getCurrentSession () получает сеанс в соответствии с текущим контекстом сеанса . Одной из реализаций этой стратегии является контекст сеанса JTA , который по существу связывает сеансы с транзакцией JTA. Транзакция JTA не «имеет» сеанс Hibernate, поскольку JTA ничего не знает о Hibernate, и было бы неправильно говорить, что Hibernate использует JTA внутри. Он просто имеет возможность интеграции с JTA и позволяет управлять транзакциями.

здесь я хочу понять роль строки // tx = session.beginTransaction ();

Он начинает транзакцию в любом используемом вами механизме транзакций, который регулируется используемой TransactionFactory . Например, с JDBCTransactionFactory он просто гарантирует, что auto-commit отключен, чтобы изменения не были зафиксированы до завершения транзакции.

как только мы фиксируем конкретную транзакцию, все транзакции, созданные из одного сеанса, будут зафиксированы один раз.

В обычных условиях сеанс связан только с одной транзакцией. Многократные вызовы Session.beginTransaction () просто возвращают одну и ту же базовую транзакцию .

Итак, чего мы пытаемся достичь с помощью // tx = session.beginTransaction ()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...