Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: сессии и транзакции 
:(
    Опции темы
MaxPayneC
Дата 26.10.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



В чем разница между сессией и транзакцией хибернейт, смотря на них как на unit of work? И зачем вообще нам нужен механизм сессий? Извиняюсь, если уже обсуждалось, не нашел ответа(
PM   Вверх
Quester82
Дата 26.10.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Если коротко, то сессия это логическая единица работы с БД, которая включает в себя одну или более реальных транзакций с базе данных.

Внутри хибернейта сессия нужна для того чтобы реализовать работу с persistent инстансами (сущностями).


Чтобы далеко не бегать, вот тебе ответ прямо из API Hinbernate.

Код

org.hibernate.Session

The main runtime interface between a Java application and Hibernate. This is the central API class abstracting the notion of a persistence service.

The lifecycle of a Session is bounded by the beginning and end of a logical transaction. (Long transactions might span several database transactions.)

The main function of the Session is to offer create, read and delete operations for instances of mapped entity classes. Instances may exist in one of three states:

transient: never persistent, not associated with any Session
persistent: associated with a unique Session
detached: previously persistent, not associated with any Session

Transient instances may be made persistent by calling save(), persist() or saveOrUpdate(). Persistent instances may be made transient by calling delete(). Any instance returned by a get() or load() method is persistent. Detached instances may be made persistent by calling update(), saveOrUpdate(), lock() or replicate(). The state of a transient or detached instance may also be made persistent as a new persistent instance by calling merge().

save() and persist() result in an SQL INSERT, delete() in an SQL DELETE and update() or merge() in an SQL UPDATE. Changes to persistent instances are detected at flush time and also result in an SQL UPDATE. saveOrUpdate() and replicate() result in either an INSERT or an UPDATE.

It is not intended that implementors be threadsafe. Instead each thread/transaction should obtain its own instance from a SessionFactory.

A Session instance is serializable if its persistent classes are serializable.

A typical transaction should use the following idiom:
 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }
 

If the Session throws an exception, the transaction must be rolled back and the session discarded. The internal state of the Session might not be consistent with the database after the exception occurs.


org.hibernate.Transaction

И про транзакции

Код

public interface Transaction

Allows the application to define units of work, while maintaining abstraction from the underlying transaction implementation (eg. JTA, JDBC).

A transaction is associated with a Session and is usually instantiated by a call to Session.beginTransaction(). A single session might span multiple transactions since the notion of a session (a conversation between the application and the datastore) is of coarser granularity than the notion of a transaction. However, it is intended that there be at most one uncommitted Transaction associated with a particular Session at any time.

Implementors are not intended to be threadsafe.




Это сообщение отредактировал(а) Quester82 - 26.10.2009, 12:20
PM MAIL   Вверх
MaxPayneC
Дата 26.10.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Хотелось бы более детальное объяснение, почему транзакций недостаточно для реализации persistence.
PM   Вверх
MaxPayneC
Дата 28.10.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Ап. Никто не может ответить?
PM   Вверх
Samotnik
Дата 28.10.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



может следует почитать документацию  ?  smile 
Ведь ответ очень легкий. Если прочитаете и не поймете,  пишите сюда -  обьясню  smile 
PM MAIL   Вверх
MaxPayneC
Дата 29.10.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Я читал эту статью ранее. Честно говоря все равно непонятно :(
PM   Вверх
baph
  Дата 30.10.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



Пишу приложение на Идее для раюоты с бд на Постгрес, вроде бы тюторы разбирал, читал про Котов,  сделал все конфиг-файлы, пропертиесы, хмл и все остально, библиотеки подключил, но не понял про пул соединений (connection pool). Поясните, что, какой сервер нужно запустить, чтобы настроить соединение с бд.  Я вроде бы в hibernate.properties все прописал,   классы написалЮ, а в бд изменений не происходит. Стал читать про коннектион пул, но так и не понял. 
PM MAIL   Вверх
chief39
Дата 3.11.2009, 13:01 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



MaxPayneC, сессия - это такой колышек, к которому привязаны козы(объекты), которых вывел из сарая пастух(достал из базы).
Это и отличает POJO объекты от хибернейт - про простой(поджо) объект никто кроме тебя не знает. Достал ты его из БД, изменил, сохранил, удалил - это сугубо твоё дело и никакой энтити менеджер не знает и не подозревает что этот объект как-то связан с ДБ и что это вообще за объект smile

А если ты извлёк хибернейт объект или создал ентити объект и сохранил его в БД - он привязывается к хибернейт сессии(тоже объект, а не что-то абстрактное smile ). Теперь сессия знает про то что творится в её королевстве, какие объекты при ней достали, какие изменили, какие сохранили. Благодаря ей теперь энтити/персистенси менеджер может автоматически сохранить в БД все изменённые объекты, синхронизировать и сделать что угодно smile

Это кагбэ так:
Есть человечек. Он сам по себе, его знают только родители и он нигде не числится и не фигурирует. Хоть умри под забором, хоть миллион найди - пофиг.
Но если его набирают в школьный класс(привязывают к сессии) он становится школьником(хибернейт объектом), а не просто обычным человечком. Теперь о нём известно из списков класса. Теперь он попадёт под вакцинацию от гриппа, теперь ему выдадут проездной, теперь его отправят на субботник вместе с остальными объект... школьниками smile

А вот транзакция - это неразрывный кусок работы, который с ними произойдёт.
Например: Целый класс собрали у ворот, посадили в автобус, повезли на экскурсию, выгуляли, привезли обратно, выгрузили. В любом случае их или свозят полноценно(коммит) или вернут автобус назад(роллбэк). Потому что нельзя детей за городом бросить, будет по шапке smile

И в то же время можно производить с этим человечком действия, не вовлекая его в транзакцию с иными учениками и автобусом(класс подмёл, почистил зубы) smile Но он всё равно будет привязан к сессии(классу).

А если детачнуть объект(выгнать из школы) - он опять станет самодостаточным POJO, о котором никому ничего и дела никому нет smile (Ну, там ещё некие детали есть, но это потом).


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
AlexeyVorotnikov
Дата 5.11.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 3
Всего: 18



chief39, 
Блестящее объяснение!
(Извините за оффтопик)


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
MaxPayneC
Дата 5.11.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Благодарю) теперь стало действительно яснее. 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.