Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Hibernate: как записать в базу промежуточные изменения? / 7 сообщений из 7, страница 1 из 1
07.02.2018, 21:37
    #39598596
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate: как записать в базу промежуточные изменения?
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
07.02.2018, 22:18
    #39598604
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate: как записать в базу промежуточные изменения?
Molasar,

- сделать в две транзакции, либо
- найти нужный элемент в списке userList и подправить "вручную" (:
...
Рейтинг: 0 / 0
07.02.2018, 22:32
    #39598606
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate: как записать в базу промежуточные изменения?
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
07.02.2018, 23:05
    #39598620
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java Hibernate: как записать в базу промежуточные изменения?
Про две транзакции, тоже так думаю, а вот по поводу всего этого метода, вы его как минимум разделите на два, который у вас тянет данные и который данные апдейтит, а то всё вместе намешано попробуй пойми что тут происходит сходу.
И еще про особенности хибернейта про кеши его, скорее всего это сюда не относится, если будет 2-е транзакции, и вы используете только createQuery(), но в любом случае будет интересно посмотреть.
Хоть я и не использую сейчас хибер, но мне понравилась эта лекция/доклад. Больше стало понимание, отчего у меня 2 года назад глюки происходили с данными в старом проекте :)

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

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

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

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

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

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

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


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