Будет ли сеанс, найденный на шаге 1 и шаге 3, одним и тем же сеансом?
Они должны быть одинаковыми, это как-то является частью договора getCurrentSession()
, и вы получите Session
, привязанный к потоку, пока единица работы не будет завершена (т.е. транзакция была совершена или откатился). Java Persistence с Hibernate выглядит так (стр.481):
Весь код доступа к данным, который вызывает getCurrentSession()
в глобальном общем доступе.
SessionFactory
получает доступ к тому же текущему Session
- если он вызывается в
та же нить. Единица работы завершается, когда Transaction
совершается (или откатывается). Hibernate также сбрасывает и закрывает текущий Session
и его постоянный контекст, если вы фиксируете или откатываете транзакцию. Здесь подразумевается, что вызов getCurrentSession()
после фиксации или отката создает новый Session
и новый контекст постоянства.
И, возможно, вы захотите прочесть, что говорит Javadoc Session#beginTransaction()
.
Если ответ на вопрос 1 положительный, то как он будет обрабатывать коммит на шаге 4. В идеале он должен сам закрывать сеанс и выдавать ошибку на шаге 5.
Шаг 4 не должен быть проблемой, Session
будет сброшен, Transaction
будет зафиксирован, а Session
закрыт. Но я ожидаю, что шаг 5 провалится с TransactionException
(это моя ставка). Но позвольте мне процитировать Javadoc Transaction
:
Транзакция связана с сеансом и обычно создается с помощью вызова Session.beginTransaction()
. Один сеанс может охватывать несколько транзакций, поскольку понятие сеанса (диалог между приложением и хранилищем данных) имеет более грубую детализацию, чем понятие транзакции. Однако подразумевается, что в любое время может быть не более одной незафиксированной транзакции, связанной с конкретным сеансом .
Как подчеркивалось выше, мы обсуждаем то, что не должно происходить (то есть проблема проектирования).