Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java tools & IDE's > Hibernate


Автор: batigoal 8.6.2006, 10:21
Допустим, есть такой код:
Код

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();

session.beginTransaction();
Something something = new Something();
session.save(something);                 // 1
session.getTransaction().commit();       // 2

sessionFactory.close();                 // 3


В какой момент произойдет реальное обращение к базе, т.е. сетевое взаимодействие - на строчке 1, 2 или 3? Или это зависит от конфигурации Hibernate'а? 

Автор: tux 8.6.2006, 17:49
Цитата(Lamer George @  8.6.2006,  15:21 Найти цитируемый пост)
В какой момент произойдет реальное обращение к базе, т.е. сетевое взаимодействие - на строчке 1, 2 или 3? Или это зависит от конфигурации Hibernate'а? 

Вообще, насколько я понимаю, Hibernate собирает все запросы в пул и по исполнении transaction.commit() запускает их все пачкой. То есть, все выполняется в строчке 2. Точно не в строчке 3, там код под это не заточен. Но, поскольку, это строчка 2, то здесь есть нюансы. Вообще говоря, вызов 
Код

session.getTransaction();

и 
Код

Transaction tr = session.beginTransaction();

это не одно и то же. Если тебя в принципе эти нюансы не волнуют, то на этом остановимся. Если больше никто ничего умного не напишет, завтра утром выдам продолжение. smile 

Автор: batigoal 8.6.2006, 22:29
Цитата(tux @  8.6.2006,  18:49 Найти цитируемый пост)
Если тебя в принципе эти нюансы не волнуют, то на этом остановимся.

Вообще говоря, волнуют. Меня серьезно интересует эта технология - и идеологически, и в прикладном плане (она, как мне кажется, довольно органично вписалась бы в наше решение). Да еще и EJB3, как я понял, заточены под работу с Hibernate. 
И у меня масса вопросов, но задавать их все тут будет просто бестактно smile

Цитата(tux @  8.6.2006,  18:49 Найти цитируемый пост)
завтра утром выдам продолжение. smile

Жду с нетерпением. 

Автор: tux 9.6.2006, 11:17
Честно говоря я и сам не понял что это хотел сказать про методы. smile Видимо то, что эти два вызова - почти одно и то же. Дело в том, что у Hibernate нет вложенных транзакций и все вызовы beginTransaction() будут возвращать один и тот же объект транзакции (естественно, до вызова commit() или rollback()).

Насчет того, что обращение к базе будет в строке 2, это верно. 

Уже давно в голове витает мысль написать несколько статей по Hibernate поскольку к нему интерес довольно велик, однако этому мешает отсутствие свободного времени. Надеюсь через некоторое время я это вре-таки сделаю. Тем более актуально, что на русском языке материалов мало. 

Автор: batigoal 9.6.2006, 11:44
Спасибо за ответ.

Цитата(tux @  9.6.2006,  12:17 Найти цитируемый пост)
Уже давно в голове витает мысль написать несколько статей по Hibernate поскольку к нему интерес довольно велик, однако этому мешает отсутствие свободного времени. Надеюсь через некоторое время я это вре-таки сделаю. Тем более актуально, что на русском языке материалов мало.  

Да. Я тут подумал о том, что можно сделать выжимку из их Getting Started, и положить в FAQ (со ссылкой, разумеется). Правда, там не всё понятно - например, я так и не понял, что они хотели сказать об отношениях many-to-many. Но спрашивать пока нет смысла, сначала покурю мануал smile 

Автор: chief39 9.6.2006, 13:34
Честно говоря.... кажется что в строке 1 могут быть тоже обращения к базе...
То есть ФИЗИЧЕСКИ данные будут передаваться СУБД и она будет выполнять инструкции. Но не комиттить.
А при роллбэке произойдёр полный роллбэк объектный  + банальный роллбэк в СУБд для данных, которые успели обработать.
Надо это как-то протестить.
Но мне кажется, что в хибернейте предусмотрели такую асинхронность в целях производительности... 

Автор: chief39 9.6.2006, 13:52
Честно говоря.... кажется что в строке 1 могут быть тоже обращения к базе...
То есть ФИЗИЧЕСКИ данные будут передаваться СУБД и она будет выполнять инструкции. Но не комиттить.
А при роллбэке произойдёр полный роллбэк объектный  + банальный роллбэк в СУБд для данных, которые успели обработать.
Надо это как-то протестить.
Но мне кажется, что в хибернейте предусмотрели такую асинхронность в целях производительности...


Цитата(Lamer George @  8.6.2006,  22:29 Найти цитируемый пост)
Да еще и EJB3, как я понял, заточены под работу с Hibernate. 

Скорее ВМЕСТО идеи энтити бинов 2.0(мать их за ногу!!!) они слизали для этих целей идею хибернейта. То есть, фактически, сделали СВОЙ хибернейт по образу и подобию... smile

ЗЫ: На следующей неделе буду пробовать джибосс 4.0.4 и еджиби 3.0 в деле.
Если что-то путёвое выйдет - расскажу.
 

Автор: batigoal 9.6.2006, 13:57
Цитата(chief39 @  9.6.2006,  14:52 Найти цитируемый пост)
Надо это как-то протестить.

Протестить, конечно, можно. Но хотелось бы быть уверенным. Ведь результат моего теста не гарантирует, что это поведение будет всегда одинаковым. 

Автор: chief39 9.6.2006, 14:11
Цитата(Lamer George @  9.6.2006,  13:57 Найти цитируемый пост)
что это поведение будет всегда одинаковым.  

А по идее и не должно быть.... Если я верно предполагаю.
Если много операций - наверное, начнёт раньше сбрасывать, чтоб потом огромный кусок данных не гнать по сети за один раз.
Это на совести реализаторов хибернейта по идее - в зависимости от чего и когда происходит сброс  в СУБД. И, скорее всего оно как-то зависит от нагрузки, частоты однотипных обращений и проч. и проч. А в доке у них это явно не оговорено? Может где-то в мэйллистах есть?

Хотя, не исключено, что они не заморачивали себе голову и всё происходит при коммите. 

Автор: batigoal 9.6.2006, 14:28
Цитата(chief39 @  9.6.2006,  15:11 Найти цитируемый пост)
А в доке у них это явно не оговорено?

Пока не нашел, но где-то наверняка должно быть. 

Автор: tux 9.6.2006, 17:44
Цитата(chief39 @  9.6.2006,  18:34 Найти цитируемый пост)
кажется что в строке 1 могут быть тоже обращения к базе...

Я тоже на самом деле не уверен, что там вызовов никогда не бывает. Вероятно, что все зависит от реализации адаптера Hibernate для конкретной СУБД. В Hibernate можно включить выдачу выполняемых запросов на консоль. Так вот, для PostgreSQL, MySQL и Hypersonic перечень выполняемых запросов вываливается только после выполнения commit(). Хотя надо бы, конечно, заглянуть в код чтобы точно знать механизм того, как обрабатывается транзакция. 

Автор: pvo 10.6.2006, 00:30
Цитата(Lamer George @  9.6.2006,  13:57 Найти цитируемый пост)
Но хотелось бы быть уверенным

Цитата(tux @  9.6.2006,  17:44 Найти цитируемый пост)
заглянуть в код

Ребят, ведь тем и хороши опенсорсные продукты - тем, что все можно посмотреть в коде. Можно продебажить ...
И иметь уверенность в том, что тул работает так, а не иначе smile

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)