powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
25 сообщений из 164, страница 2 из 7
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085020
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
PetroNotC Sharp
andreykaT,

А тебе? Ты же два слова связать не можешь.
Обычно троечники возмущаются отличниками)

а мне не сказали. читай заголовки в следующий раз внимательнее.
по топику что есть или ты троечник?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085021
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
>а мне не сказали
Табаки))
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085022
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,
смотри в чем дело

вот простейшая сучность

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Entity
@Getter
@Setter
public class A {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "ID_GENERATOR")
  @SequenceGenerator(name="ID_GENERATOR",sequenceName = "a_id_seq")
  private Long id;

  private String name;



вот ее ддлка
Код: plsql
1.
2.
3.
4.
5.
create sequence a_id_seq increment 50;
create table A(
  id bigint DEFAULT nextval('a_id_seq') primary key ,
  name text
);



что далее при инсерте мы получаем то что и ожидаем

вот код на вставку,тут генерируется 100 сучностей

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public List<A>getTestListA(){
    List<A> aList = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
      A a = new A();
      a.setName("a" + i);
//      a.setBList(getTestListB());
      aList.add(a);

    }
    return aList;
  }



сгенерированый список записывается методом save() -стандартный метод JPARepository
Код: java
1.
2.
3.
4.
5.
6.
 @PostMapping
  public String saveAllTest(){
    var list=batchTestingService.getTestListA();
    aRepository.saveAll(list);
    return "OK";
  }



два селекта в sequence и 1 булк инсерт

Код: java
1.
2.
3.
3193301 nanoseconds spent preparing 3 JDBC statements;
    390061405 nanoseconds spent executing 2 JDBC statements;
    431665399 nanoseconds spent executing 1 JDBC batches;



тут все хорошо

идем далее берем из базы эти сучности ,сеттим им новое имя - складываем в лист и сохраняем тем же методом save()
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  @PutMapping
  public String updateAllTest(){
    var list=aRepository.findAll();
    for (int i = 0; i <list.size() ; i++) {
      list.get(i).setName("A"+i);

    }
    aRepository.saveAll(list);
    return "OK";
  }



при этом мы получаем вот такую картину

Код: java
1.
2.
3.
3193301 nanoseconds spent preparing 101 JDBC statements;
    390061405 nanoseconds spent executing 100 JDBC statements;
    431665399 nanoseconds spent executing 1 JDBC batches;


где видно что хибер сделал 100 запросов в бд ,я посмотрел что это за запросы
это обычный селект сучности A из таблицы А


вопрос зачем хибер это делает и как этого избежать
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085025
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
O_79_O,

а если между findAll() и saveAll(list), кто то чета изменил?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085026
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,

22349280
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085028
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,

Убери for и разберись пока без него
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085029
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,

авторкак этого избежать убрать прокладку.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085032
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
am_sasa
O_79_O,

а если между findAll() и saveAll(list), кто то чета изменил?

ну так я и изменил - все верно почему делаются селекты в бд ,если и так есть перситенс сущности
или ты намекаешь на то,что хибер делает dirty check чтоли вот этими селектами ,сравнивая текущее состояние сучности с состоянием в бд?
если это так то как тогда делать булк апдейты?
писать nativeQuery типо update .... set .... where .....?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085037
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,

хибер для двухзвенной архитектуры , и он подразумевает, что есть и другие хиберы (у других юзеров) которые могли изменить. вот он и перестраховывается
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085039
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
O_79_O,

авторкак этого избежать
убрать прокладку.
опять ты за свое ,хотел бы я посмотреть на тебя,как ты выпилишь хибер из уже существующего проекта ,кто это согласует и самое главное кто оплатит? ты бизнесу что скажешь? извините мы пару лет назад ошиблись при выборе стека технологий,дайте нам еще годик на перевод системы на новое ядро?)))
Вадя обычно при приеме на работу разработчки среднего звена работают с тем,что есть ,мы лишь можем порекомендовать лиду что то.
Ну он скажет да - было бы здорово и на этом все закончится)
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085043
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
O_79_O,

хибер для двухзвенной архитектуры , и он подразумевает, что есть и другие хиберы (у других юзеров) которые могли изменить. вот он и перестраховывается

ну теперь все понятно стало,тоесть фактически булк апдейт можно сделать лишь непосредственно прямым запросом,не вытаскивая сущности из базы.
Хорошо хотя бы то,что новые сучности инсертятся булком,ну а апдейт - конечно печалька.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085048
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
>если это так то как тогда делать булк апдейты?
= не дошло?
Crud это не булки, пакеты, импорты, и экспорты.
Все уже на форуме это знают
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085050
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
O_79_O

или ты намекаешь на то,что хибер делает dirty check чтоли вот этими селектами ,сравнивая
намекаю
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085063
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
O_79_O,

авторкак этого избежать
убрать прокладку.
ну вот смотри - у меня есть некие запииси в таблице,я их оттуда достал - модифицировал и обратно сохранил
причем я не знаю в какие колонки и в каких записях были поменны,как ты это сделаешь без просйлоки?
начнешь писать тонны бойлер кода
а хибер дает тебе вомзможность сделать это в одну строчку saveAll(List list)
при этом он выполнит теже операции что и ты ,а может и меньше за счет кеширования
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085066
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O
вадя
O_79_O,

пропущено...
убрать прокладку.

ну вот смотри - у меня есть некие запииси в таблице,я их оттуда достал - модифицировал и обратно сохранил
причем я не знаю в какие колонки и в каких записях были поменны,как ты это сделаешь без просйлоки?
начнешь писать тонны бойлер кода
а хибер дает тебе вомзможность сделать это в одну строчку saveAll(List list)
при этом он выполнит теже операции что и ты ,а может и меньше за счет кеширования
встретились два максималиста. Один зa орм, второй за jdbc)
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085069
вадяхибер для двухзвенной архитектуры , и он подразумевает, что есть и другие хиберы (у других юзеров) которые могли изменить. вот он и перестраховываетсяПерестраховывается? Другие хиберы? Вадя как обычно комментирует в темах в которых нисколько не разбирается *facepalm*
O_79_Oну теперь все понятно стало,тоесть фактически булк апдейт можно сделать лишь непосредственно прямым запросом,не вытаскивая сущности из базы.Я не уверен что ты правильно используешь термин bulk update. Bulk/batch обновления это про hibernate.order_updates , hibernate.order_inserts .

Никаких select'ов при insert'e новых данных быть не должно. И смотреть для дебага нужно не статистику, а show_sql и use_sql_comments, и желательно логирование на уровне драйвера ( см. тут )
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085073
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O
Pвопрос зачем хибер это делает и как этого избежать


у тебя find и saveAll выполняются в разных транзакциях, т.е. в saveAll ты передаешь сущности, которые персистенс-контексту не известны (он их не загружал), а разработчики spring-data-jpa влепили в save вызывов em.merge() отсюда у тебя лишние селекты.

вообще у тебя должно выглядеть все так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
  @Transactional
  @PutMapping
  public String updateAllTest(){
    var list=bRepository.findAll();
    for (int i = 0; i <list.size() ; i++) {
      list.get(i).setName("bbb"+i);

    }
    //bRepository.saveAll(list); save не нужен
    return "OK";
  }
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085074
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,

автору меня есть некие запииси в таблице,я их оттуда достал - модифицировал и обратно сохранилтут проблема в том, что ты работаешь с записями, которые извлек. и они у тебя в коде.
с записями, а не с одной записью.

и даже когда у тебя один сервер с хибером - свой набор сучностей у каждого коннекта, по сути двухзвенка.
тут надо логику менять, не держать в памяти кучу данных в листах.
клиент изменил поле надо отправить на сервер и проанализировать кто ещё оперирует с этой записью, чтоб исключить спорную ситуацию с изменением ем данных.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085075
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

авторкоторые могли изменить. вот он и перестраховывается
Перестраховывается? Другие хиберы? Вадя как обычно комментирует в темах в которых нисколько не разбирается *facepalm*ты читай правильно - в двухзвенной системе хибер есть у каждого клиента. они ничего не знают о состоянии друг друга
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085095
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Stanislav Bashkyrtsev,

авторкоторые могли изменить. вот он и перестраховывается
Перестраховывается? Другие хиберы? Вадя как обычно комментирует в темах в которых нисколько не разбирается *facepalm*
ты читай правильно - в двухзвенной системе хибер есть у каждого клиента. они ничего не знают о состоянии друг друга

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

@PostMapping а это видимо коттроллеры и если все стандартно спринг бут томкат то каждый запрос отдельный поток и отдельная сессия.

Хиренейт не видит в новой сесии объекты и освежает их запросом к бд.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085103
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

авторну не укаждого хибер есть все таки, а только что сессии разные. ибо сессия к потоку привязана.
ну это уже тонкости, которые тут роли не играют.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085104
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
O_79_O
Pвопрос зачем хибер это делает и как этого избежать


у тебя find и saveAll выполняются в разных транзакциях, т.е. в saveAll ты передаешь сущности, которые персистенс-контексту не известны (он их не загружал), а разработчики spring-data-jpa влепили в save вызывов em.merge() отсюда у тебя лишние селекты.

вообще у тебя должно выглядеть все так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
  @Transactional
  @PutMapping
  public String updateAllTest(){
    var list=bRepository.findAll();
    for (int i = 0; i <list.size() ; i++) {
      list.get(i).setName("bbb"+i);

    }
    //bRepository.saveAll(list); save не нужен
    return "OK";
  }



как обычно чотко и по делу,спасиб за совет

самое смешное я прекрасно помню что хибер отслеживает состоянии персистеной сущности и любое изменение акутализирует,но анотацию ума поставить не хватило)
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085105
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lleming
вадя
Stanislav Bashkyrtsev,

пропущено...
ты читай правильно - в двухзвенной системе хибер есть у каждого клиента. они ничего не знают о состоянии друг друга


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

@PostMapping а это видимо коттроллеры и если все стандартно спринг бут томкат то каждый запрос отдельный поток и отдельная сессия.

Хиренейт не видит в новой сесии объекты и освежает их запросом к бд.

так причем тут контроллер вообще?Ты же видешь что работа идет в рамках одного запроса - тоесть по сути не важно контроллер это или обычный тест бы дергал метод этот.
А вот то что findAll и saveAll выполняются в двуз разнызх транзакциях - я забыл,хотя читал про то что у хибера без анотации
@Transactional любой такой запрос это одна транзакция
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085117
O_79_O
lleming
пропущено...


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

@PostMapping а это видимо коттроллеры и если все стандартно спринг бут томкат то каждый запрос отдельный поток и отдельная сессия.

Хиренейт не видит в новой сесии объекты и освежает их запросом к бд.

так причем тут контроллер вообще?Ты же видешь что работа идет в рамках одного запроса - тоесть по сути не важно контроллер это или обычный тест бы дергал метод этот.
Вообще важно. Если бы у тебя был Spring Boot, то по умолчанию он сконфигурил бы OpenEntityManagerInViewInterceptor и тогда сессия (EntityManager) создалась бы до контроллера. В таком случае проблемы с лишними select'ами не было бы потому как объекты бы были в сессии уже. Это все равно было бы неправильно (тут явно нужна одна транзакция), но select'ов бы не было. В обычном Spring MVC надо OSIV настраивать самому, причем можно фильтром а не интерсептором (и это лучше чем неявная конфигурация SpringBoot'ом).

А вот в тесте никто бы сессию не открыл без @Transactional. Разве что это RestAssured и/или MockMvc тесты.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085119
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
Ты убедись тестами что в одном методе идут две разных сессии хибера. Для хибера имеет значение сессия его в твоем вопросе.
...
Рейтинг: 0 / 0
25 сообщений из 164, страница 2 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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