powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: в базу не сохраняет, однако запросом достает.
8 сообщений из 8, страница 1 из 1
Hibernate: в базу не сохраняет, однако запросом достает.
    #38697421
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имею такой код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
package hibernate;
import java.util.*;
import org.hibernate.*;
public class HibernateGames {
    public static void main(String[] args) {

        Session session = HibernateUtil.getSessionFactory().openSession();
        Message message = new Message("Hello World");
        Long msgId = (Long) session.save(message);
        session.close();

        Session newSession = HibernateUtil.getSessionFactory().openSession();
        List messages = newSession.createQuery("from Message m order by m.text asc").list();
        System.out.println(messages.size() + " message(s) found:");
        for (Iterator iter = messages.iterator();iter.hasNext(); ) {
            Message loadedMsg = (Message) iter.next();
            System.out.println(loadedMsg.getText());
        }
        newSession.close();
        HibernateUtil.shutdown();
    }
}



Результат: в базе ничего не сохраняется, однако запрос один Message находит. Хотя в базе его нет. Как так?

QueryCache у меня отключен. Значит, запрос идет напрямую в базу. Однако там ничего нет. Я продебажил запрос до PreparedStatement.execute() и вижу что да, возвращает объект на этом уровне. Но в базе-то его нет.
Загадка.

Кроме того, хотелось бы уточнить: получается что Session.save никак не может сохранить объект в базу, если нет транзакции. Не помогает даже flush(). Это так, или у меня с настройками что-то?
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38697426
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.1.7. Loading and storing objects :
Код: sql
1.
2.
3.
4.
5.
6.
7.
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();

Ваши изменения кода сделаны на основании чего-то или просто потому, что "так проще"?
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38697430
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
я не то чтобы пишу что-то, а просто хочу лучше понять как Hibernate устроен изнутри. Да, если добавить транзакцию то все станет понятно. Однако мне интересно без нее: как оно может достать из базы то, чего нет?..
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38697439
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто технически, соединение с базой может быть создано в режиме "автоматическая фиксация" (autocommit).
Только это не выключает транзакции, это всего лишь означает, что после каждой вставки/обновления/удаления драйвер автоматически добавит commit.
Единственное, что может быть:
1. Соединение создаётся без автофиксации;
2. Транзакция автоматически начнётся при выполнении первого оператора;
3. Все остальные операторы будут выполнены в рамках этой же неявной транзакции;
4. Выборка вернёт вставленную запись, т.к. выполняется в одной транзакции со вставкой;
5. Завершение сессии завершит транзакцию, а это, в свою очередь, отменит все изменения (неявный rollback), т.к. никто не позаботился зафиксировать изменения.
Исключениями являются автономные транзакции, которые можно фиксировать вне зависимости от объемлющей транзакции.
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38697445
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytryпросто хочу лучше понять как Hibernate устроен изнутриORM-ы, в общем-то, придуманы для того, чтобы не требовалось знать внутреннего устройства
А для ковыряния в потрохах, вероятно, разумнее будет выбрать библиотеку попроще и такую, где вы хорошо знаете то, что эта библиотека "обёртывает".
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38698527
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
спасибо за версию!

Что такое автофиксация? Я всегда читаю на английском, это свойство autoCommit в jdbc.connection?

Похоже что вы правы: мне удалось повторить это без хибернейта. Если написать INSERT через чистый jdbc, затем сделать SELECT, а затем закрыть connection без коммита - тот SELECT все равно покажет несуществующий после закрытия connection ряд.
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38698567
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryЧто такое автофиксация? Я всегда читаю на английском, это свойство autoCommit в jdbc.connection?Да, именно это свойство.
...
Рейтинг: 0 / 0
Hibernate: в базу не сохраняет, однако запросом достает.
    #38698644
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytry Если написать INSERT через чистый jdbc, затем сделать SELECT, а затем закрыть connection без коммита - тот SELECT все равно покажет несуществующий после закрытия connection ряд.

Уровень изоляции READ_COMMITED. Изменения в бд без коммита видны только в этой сессии, после коммита зафиксированы в бд и видны всем остальным сессиям.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: в базу не сохраняет, однако запросом достает.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]