Hibernate Tutorial

 
 
 
Сообщения:41
По поводу п. 7 (запуcк простейшего примера)
 
  public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Book book = new Book();
        book.setPageCount(520);
        book.setTitle("Tales of Round Table");
        session.save(book);
        book = (Book) session.get(Book.class, book.getId());
        book.setPageCount(430);
        session.save(book);
        session.delete(book);
        session.flush();
        session.close();
    }


Транзакция тут в какой-то момент по умолчанию создается и коммитится? Если да, то когда? Эквивалентен ли этот код следующему коду (уже вижу, что нет, но почему?).
Или после каждого save/delete по умолчанию транзакция коммитится? Почему после второго save поле Title в базе не меняется при построчном отслеживании состояния? (да и вообще update не выполняется, судя о логам). После delete тоже база не меняется, только после flush. Какова тут логика Hibernate?

 
  public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
       [i]Transaction tx = session.beginTransaction();[/i]
        Book book = new Book();
        book.setPageCount(520);
        book.setTitle("Tales of Round Table");
        session.save(book);//сохранили книгу, наш id сгенерировался и сразу заполнился
        book = (Book) session.get(Book.class, book.getId());
        book.setPageCount(430);
        session.save(book);
        session.delete(book);
[i]       tx.commit();[/i]
       session.close();
    }
Изменен:30 дек 2012 10:52
 
 
Сообщения:9915
В примере для простоты был установлен autocommit=true (глянь в гланый конфигурационный файл), поэтому после каждого запроса происходит коммит транзакции. Если задашь вопрос в отдельной теме, отвечу более развернуто на заданные вопросы.
 
 
Сообщения:86
Я извиняюсь, может чего не заметила.
Подскажите как вернуть название книги по её id?
 
 
Сообщения:9915
Book book = (Book) session.get(Book.class, book.getId());
String title = book.getTitle();
 
 
Сообщения:86
Староверъ, мерси. Оставлю тут, чтобы больше не тревожили. =)

Используя Hibernate 3, выбираем и выводим название книжки с указанным ID:
System.out.println("========КНИГА с id=2 =========");
        long id = 2;
        book.setId(id);
        book = (Book) session.get(Book.class, book.getId());
        System.out.println(book.getTitle()); 


Выбираем максимальный ID:
System.out.println("======== максимальный id  =========");
        Criteria criteria = session.createCriteria(Book.class).setProjection(Projections.max("id"));
        Long maxID = (Long)criteria.uniqueResult();
        System.out.println(maxID);


Интересно, а как задать два критерия. Например, выбрать название книги с максимальным ID и минимальным количество страниц (предположив, что количество страниц в примере разное)...
 
 
Сообщения:9915
Hibernate Query Language, Hibernate Criteria API.
 
 
Сообщения:1
Где должен лежать конфигурационный файл hibernate.cfg.xml?
Я деплою свое приложение на tomcat:
\webapps\login\WEB-INF\classes\com\fergus\utils\HibernateUtil.class

Сюда положил конфигурационный файл:
\webapps\login\WEB-INF\hibernate.cfg.xml

Но при загрузке сессия не создается и ничего не происходит. Подскажите пожалуйста как бороться с этим.
 
 
Сообщения:9915
Создай тему и обсудим.
 
 
Сообщения:44
Можно пример для JPA + Hibernate?
Нашел статью на Хабре: http://habrahabr.ru/sandbox/24224/
Но непонятны те строки, где используется Maven.
Изменен:03 апр 2013 13:03
 
 
Сообщения:42
Какую версию и литературу посоветуете на данный момент?
Изменен:20 апр 2013 21:45
 
 
Сообщения:9915
Java Persistence with Hibernate
Изменен:21 апр 2013 09:39
 
 
Сообщения:2
session.get(Book.class, bookId) - будет обращаться к БД (ну или найдет объект в кеше) и вернет инициализированный прокси. Если объект не будет найден, вернется null. Когда мы обращаемся к ленивым полям, они загружаются.
Работаю с 4 хибом. При вызове get все поля инициализируются из базы. Т.е. объект тащит за собой все связи(коллекции объектов, объекты), происходят явные обращения к базе(это видно в консоли). Где-то читал что по-умолчанию выставлена ленивая загрузка, но увы у меня это не так. Приходится аннотациями выставлять fetch = FetchType.LAZY. Пример: Запрашиваем объект Author из базы, ленивым полем у него является список книг...если сессия после выборки закрыта(а она будет закрыта если используется getCurrentSession()), то при явном обращении к полю author.getBooks() вылетит исключение. Нужно будет из DAOшки методом getAllAuthorBooks(long id) запрашивать явно список книг. Такой подход несколько неудобен, зато есть плюсы: мелкие запросы, получаем только то, что нам нужно, сессия не простаивает. Есть конечно и минусы. Кстати говоря (насколько я помню) данный форум таким образом работает.
 
 
Сообщения:586
Quote:
при работе с Hibernate - сессия живет одну транзакцию, а то и меньше.


Сессия с точки зрения БД - это соединение, как соединение может жить меньше транзакции? Только если речь идет о JTA, где в одной транзакции может участвовать несколько соединений, но сдается мне, что речь идет о другом.
 
 
Сообщения:9915
samolisov:
как соединение может жить меньше транзакции?
Хм.. хотел бы я помнить о чем в тот момент думал =) Ща подправлю, спасибо.
samolisov:
Сессия с точки зрения БД - это соединение
Не понял как это.. Hibernate сессия и БД соединение - это разные вещи, одна сессия может использовать несколько соединений открывая и закрывая их, а может и вообще не использовать доставая все объекты из кеша.
Изменен:16 мая 2014 21:47
 
 
Сообщения:586
Не точно выразился. Имел ввиду, что сессия - это то, через что мы получаем соединение с базой при необходимости. В том смысле, что странно отдавать соединение, не завершив транзакцию.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет