powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate: как записать в базу промежуточные изменения?
7 сообщений из 7, страница 1 из 1
Java Hibernate: как записать в базу промежуточные изменения?
    #39598596
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java Hibernate

Сначала вывожу ФИО пользователей (сущность User).
Затем меняю имя пользователя Maxim на Bill.
Снова вывожу ФИО пользователей. Изменений нет.
Имя обновляется после 2-го вывода пользователей.

Как обновить сущность User сразу после изменения имени и до 2-го вывода на экран?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
try {
            entityManager.getTransaction().begin();

            List<User> userList = entityManager.createQuery("from User")
                    .getResultList();
            for(User u : userList) {
                System.out.println(u);
            }

            int updatedEntities = entityManager.createQuery(
                    "update User u set u.firstName = :newName where u.firstName = :oldName")
                    .setParameter("oldName", "Maxim")
                    .setParameter("newName", "Bill")
                    .executeUpdate();

            userList = entityManager.createQuery("from User")
                    .getResultList();
            for(User u : userList) {
                System.out.println(u);
            }

            entityManager.getTransaction().commit();
        } catch (Exception e) {
            if (entityManager.getTransaction() != null)
                entityManager.getTransaction().rollback();
            e.printStackTrace();
        } finally {
            entityManager.close();
            entityManagerFactory.close();
        }
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598604
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

- сделать в две транзакции, либо
- найти нужный элемент в списке userList и подправить "вручную" (:
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598606
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,
где ты этого кода понабрал для изменения ОДНОГО поля с данными?
Что будет для 10000 данных в корпоративе?
18407424

Код: java
1.
2.
3.
4.
5.
sess = Utils.GetSession
User user = sess.GetObj(123);
user.SetName('Вася');
sess.saveOrUpdate(user);
sess.Commit;
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598620
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про две транзакции, тоже так думаю, а вот по поводу всего этого метода, вы его как минимум разделите на два, который у вас тянет данные и который данные апдейтит, а то всё вместе намешано попробуй пойми что тут происходит сходу.
И еще про особенности хибернейта про кеши его, скорее всего это сюда не относится, если будет 2-е транзакции, и вы используете только createQuery(), но в любом случае будет интересно посмотреть.
Хоть я и не использую сейчас хибер, но мне понравилась эта лекция/доклад. Больше стало понимание, отчего у меня 2 года назад глюки происходили с данными в старом проекте :)

YouTube Video
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598633
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar
Код: java
1.
createQuery(

если вы будете с таким кодом работать, то вы с ОРМ работать не научитесь. Вам DataSet нужен.
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598752
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

Как верно заметили выше, вы перебарщиваете с запросами. В вашем сценарии запросы не нужны в принципе.
Для выборки пользователей используйте EntityManager.find
А для обновления
user.setName()
Этого должно быть достаточно если dirty checking не отключен. ORM обнаружит что вы изменили объект и сохранит его во время flush или commit.

Ваша проблема заключается в том что ORM оперирует запросами и объектами отдельно. Когда вы вызывали executeUpdate(), запрос не выполнился тут же. Он добавился в очередь. И выполнится он когда-нибудь потом во время синхронизации сессии с БД.

ORM работает через 2х уровневое кеширование. Первый уровень это ваш EntityManager, который аккумулирует объекты и то что вы хотите с ними сделать. А второй уровень это кеш между ORM и базой чтобы минимизировать количество обращений к базе.

В вашем случае вы загружаете объект User и потом просите EM выполнить некий запрос. ORM не всегда достаточно умный чтобы догадаться какие именно объекты ваш запрос изменит.

Для вашего кода есть просто решение - вызвать flush после апдейта. Но ,в целом, это костыль.
...
Рейтинг: 0 / 0
Java Hibernate: как записать в базу промежуточные изменения?
    #39598792
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо! Очень хорошо объяснили принципы работы!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate: как записать в базу промежуточные изменения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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