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

Есть две сущности ,ака таблицы

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

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  private Long id;

  private String name;

  @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  List<B> bList;


}




ее DDL

Код: plsql
1.
2.
3.
4.
create table A(
  id bigint DEFAULT nextval('a_id_seq') primary key ,
  name text
);



вторая сущность и ее таблица

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

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  @ManyToOne
  @JoinColumn(name="a_id", nullable=false)
  private A a;
}



ее ддл

Код: plsql
1.
2.
3.
4.
5.
6.
create table B(
  id bigint generated always as identity primary key,
  name text,
  a_id bigint references a on delete cascade

)




вопрос в чем ,в том что сейчас если я беру обычный джава метод и генерую сначала список объектов класса B, затем генериую спискок объектов класса A и туда делаю set <List<B>> и далее делаю saveAll(List<A>)
a получаю две заполненные таблицы)) но прикол в том что FK в таблице B null
я знаю почему это получается ,потому что во время комита транзакции у хибера еще нет id класса A ,так как генерация по стратегии секвенс.Если поменять на Idenity все будет норм- но у меня как раз обратная задача.
Поэтому ворпос к знатокам можно ли в процесее сохраннения сущности А каскадно сохранить и все сущности класса В с корректным FK
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084922
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
Код дай. А не рассказом как ты его писал.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084924
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
И сиквенс то где?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084925
O_79_O , я правильно понимаю, что ты смешиваешь IDENTITY & SEQUENCE в одном проекте? Не думаю что это хорошая идея.

Когда ты вызываешь save(), то по завершению этого метода Hibernate обязан выдать сущности ID. В случае SEQUENCE все норм - мы просто берем следующую цифру, назначаем ее сущности и возвращаем. При этом никаких запросов в БД не уходит.

А в случае IDENTITY порядок другой - ID назначает СУБД, поэтому ORM'у приходится делать сразу же INSERT. Мне кажется эту проблему никак не обойти кроме как сначала сохранять А без B, делать flush(), а затем проставлять коллекцию и снова сохранять.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084926
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,
Если смешивает то дурак
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084931
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
O_79_O , я правильно понимаю, что ты смешиваешь IDENTITY & SEQUENCE в одном проекте? Не думаю что это хорошая идея.

Когда ты вызываешь save(), то по завершению этого метода Hibernate обязан выдать сущности ID. В случае SEQUENCE все норм - мы просто берем следующую цифру, назначаем ее сущности и возвращаем. При этом никаких запросов в БД не уходит.

А в случае IDENTITY порядок другой - ID назначает СУБД, поэтому ORM'у приходится делать сразу же INSERT. Мне кажется эту проблему никак не обойти кроме как сначала сохранять А без B, делать flush(), а затем проставлять коллекцию и снова сохранять.

Стасян это тесты - в проекте пока все Identity и моя задача как раз все это снести ,заменив на sequence

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

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

и таблица А и таблица Б имеют секвенс генератор

в тот же самый момент
при апдейте таблицы B

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  @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);
    return "OK";
  }



я получаю вот такую стату

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    23500 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    16052000 nanoseconds spent preparing 2501 JDBC statements;
    9248371100 nanoseconds spent executing 2500 JDBC statements;
    10362668600 nanoseconds spent executing 5 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    10398905100 nanoseconds spent executing 1 flushes (flushing a total of 2500 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)



где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей

и тут возникает вопрос откуда братец 2500 построчных запросов то - ведь уже идентификторы все sequnce
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084937
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


Опять что-то пытаешься "оптимизировать"? у тебя статистика вместе и на select и на update, подумай каким образом хибер будет собирать граф, если у тебя:

B -> A -> B[]

и у всех при этом fetch = FetchType.EAGER?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084938
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мышь плачет, но продолжает есть кактус...
НО! есть прогресс - выкладывает ddl....
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084939
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Первый вопрос про сиквенс уже решили)))
Съехал на вопрос - почему много запросов)))
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084943
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


Опять что-то пытаешься "оптимизировать"? у тебя статистика вместе и на select и на update, подумай каким образом хибер будет собирать граф, если у тебя:

B -> A -> B[]

и у всех при этом fetch = FetchType.EAGER?

тоесть при апдейте B хибер лезет в А потом опять в В?

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

ОРМ для CRUD, оптимизатор))))
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084950
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


Опять что-то пытаешься "оптимизировать"? у тебя статистика вместе и на select и на update, подумай каким образом хибер будет собирать граф, если у тебя:

B -> A -> B[]

и у всех при этом fetch = FetchType.EAGER?

сделал LAZY
сделал апдейт таблицы B
статистика ровно таже самая
Код: plsql
1.
2.
3.
4.
5.
  27300 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    3439100 nanoseconds spent preparing 101 JDBC statements;
    401003800 nanoseconds spent executing 100 JDBC statements;
    391480100 nanoseconds spent executing 1 JDBC batches;


щас включу логи хибера посмотрю что эта с**а селектит то 100 раз
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084953
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
O_79_O,
похоже на то ,что при saveAll()
хибер чекает каждый элемент на наличие в базе путем селекта обычного - гениально б ля ,и после этого делает батч апдейт/инсерт
тоесть в любом случае ,какой бы не был идентификатор хибер будет делать тоже количество селектов,что и количество элементов в вашем списке - это какой то лютый пиз дец - неужели нельзя было реализовать это как то по другому ,чем делать хренову тонну селектов то
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40084954
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при апдейте хибер генерит вот такие запросы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
    select
        b0_.id as id1_11_0_,
        b0_.a_id as a_id2_11_0_,
        b0_.name as name3_11_0_ 
    from
        b b0_ 
    where
        b0_.id=?



следом за ними идет пачка вот таких

Код: plsql
1.
2.
3.
4.
5.
6.
7.
   update
        b 
    set
        a_id=?,
        name=? 
    where
        id=?



запросов типа селект 11

запросов типа update 5

при этом в таблице находится 10 записей)


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


что происходит я честно не очень понимаю


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


пс.Вообщем выяснил что при генерации id по стратегии sequence хибер будет каждый раз делать селект в этот самый секвенс при вставке строчки
Лечится это инкрементом на 50 хотя бы,тогда время вставки вырастает пропорционально в 50 раз
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085005
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O
забыл ник,интересно к чему тут твой бесполезный коментарий)


пс.Вообщем выяснил что при генерации id по стратегии sequence хибер будет каждый раз делать селект в этот самый секвенс при вставке строчки
Лечится это инкрементом на 50 хотя бы,тогда время вставки вырастает пропорционально в 50 раз


Потому что все должно идти от таблиц. Хибернейт неплох для простых админок CRUD где не сильно много связей между сущностями. Щаг влево-вправо и начинается возня, типичным примером является твой вопрос.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085010
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
O_79_O,
Код дай. А не рассказом как ты его писал.

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


пс.Вообщем выяснил что при генерации id по стратегии sequence хибер будет каждый раз делать селект в этот самый секвенс при вставке строчки
Лечится это инкрементом на 50 хотя бы,тогда время вставки вырастает пропорционально в 50 раз


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


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

со вставкой я разобрался - хибер делает селекты в секвенс и берет оттуда значение - с этим все норм и лечится это увеличением шага инкремента до дефолтных для хибера 50

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

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

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

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

а мне не сказали. читай заголовки в следующий раз внимательнее.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085019
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
>имея список перстистеных сущностей зачем то опять идет в базу и достает их оттуда построчно и потом так же построчно апдейтит
=
А) проверить версию в бд сучности
Б) хибер не имеет список при коротких транзакциях.
...
Рейтинг: 0 / 0
25 сообщений из 164, страница 1 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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