Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
Всем привет

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

@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

create table A(
  id bigint DEFAULT nextval('a_id_seq') primary key ,
  name text
);


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

@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;
}


ее ддл

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
20 июл 21, 20:02    [22349117]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
O_79_O,
Код дай. А не рассказом как ты его писал.
20 июл 21, 20:19    [22349120]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
O_79_O,
И сиквенс то где?
20 июл 21, 20:26    [22349122]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 186
O_79_O, я правильно понимаю, что ты смешиваешь IDENTITY & SEQUENCE в одном проекте? Не думаю что это хорошая идея.

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

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

Сообщение было отредактировано: 20 июл 21, 20:19
20 июл 21, 20:27    [22349123]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
Stanislav Bashkyrtsev,
Если смешивает то дурак
20 июл 21, 20:28    [22349124]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
Stanislav Bashkyrtsev
O_79_O, я правильно понимаю, что ты смешиваешь IDENTITY & SEQUENCE в одном проекте? Не думаю что это хорошая идея.

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

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

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

догадайся почему?
20 июл 21, 21:10    [22349132]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
сейчас я смотрел на то как хибер будет сохранять две сущности связанные 1 ко многим,если у базовой секвенс а у списка идентити
в итоге получилось что и ожидалось хибер батчем записал все что секвенс и потом построчно все что идентити

что далее - я меняю сущности В идентификатор на секвенс ,записываю заново и получаю ровно ту же картину - опять построчная запись,хотя в доках напиисано иное
20 июл 21, 21:16    [22349134]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
O_79_O,
У тебя удивительная способность задавать глупые детские вопросы.
Зачем смешивать селедку с молоком?
20 июл 21, 21:19    [22349135]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
Stanislav Bashkyrtsev,
смотри статистику
сейчас я поменял все на секвенс

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

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

  @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";
  }


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

    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
20 июл 21, 21:32    [22349137]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3874
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


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

B -> A -> B[]

и у всех при этом fetch = FetchType.EAGER?
20 июл 21, 21:55    [22349140]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18912
мышь плачет, но продолжает есть кактус...
НО! есть прогресс - выкладывает ddl....
20 июл 21, 21:55    [22349141]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
вадя,
Первый вопрос про сиквенс уже решили)))
Съехал на вопрос - почему много запросов)))
20 июл 21, 22:00    [22349144]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
Андрей Панфилов
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


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

B -> A -> B[]

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

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

выход какой или лейзи инициализация или ?

Сообщение было отредактировано: 20 июл 21, 22:41
20 июл 21, 22:45    [22349155]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
O_79_O,

ОРМ для CRUD, оптимизатор))))
20 июл 21, 23:06    [22349157]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
Андрей Панфилов
O_79_O
где мы видем что вместо 5 батчей( батч сайз настроен на 500) у нас произошло 2500 запросов и потом 5 батчей


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

B -> A -> B[]

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

сделал LAZY
сделал апдейт таблицы B
статистика ровно таже самая
  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 раз
20 июл 21, 23:27    [22349163]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
O_79_O,
похоже на то ,что при saveAll()
хибер чекает каждый элемент на наличие в базе путем селекта обычного - гениально б ля ,и после этого делает батч апдейт/инсерт
тоесть в любом случае ,какой бы не был идентификатор хибер будет делать тоже количество селектов,что и количество элементов в вашем списке - это какой то лютый пиз дец - неужели нельзя было реализовать это как то по другому ,чем делать хренову тонну селектов то
20 июл 21, 23:42    [22349166]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
при апдейте хибер генерит вот такие запросы
    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=?


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

   update
        b 
    set
        a_id=?,
        name=? 
    where
        id=?


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

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

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


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

Сообщение было отредактировано: 20 июл 21, 23:42
20 июл 21, 23:51    [22349169]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
забыл ник
Member

Откуда:
Сообщений: 3477
O_79_O


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


Да ладно, хибернейт же лучшее изобретение человечества? или уже нет?
21 июл 21, 02:12    [22349180]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
забыл ник,интересно к чему тут твой бесполезный коментарий)


пс.Вообщем выяснил что при генерации id по стратегии sequence хибер будет каждый раз делать селект в этот самый секвенс при вставке строчки
Лечится это инкрементом на 50 хотя бы,тогда время вставки вырастает пропорционально в 50 раз
21 июл 21, 11:19    [22349252]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
забыл ник
Member

Откуда:
Сообщений: 3477
O_79_O
забыл ник,интересно к чему тут твой бесполезный коментарий)


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


Потому что все должно идти от таблиц. Хибернейт неплох для простых админок CRUD где не сильно много связей между сущностями. Щаг влево-вправо и начинается возня, типичным примером является твой вопрос.
21 июл 21, 11:25    [22349259]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3434
PetroNotC Sharp
O_79_O,
Код дай. А не рассказом как ты его писал.

тебе сюда вход воспрещен. не понятно чтоле из названия?
21 июл 21, 11:34    [22349268]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
O_79_O
Member

Откуда:
Сообщений: 215
забыл ник
O_79_O
забыл ник,интересно к чему тут твой бесполезный коментарий)


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


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


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

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

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

при попытке апдейта некоего количества запиисей в бд происходит не совсем для меня понятный процесс
а имеено хибернейт и так уже имея список перстистеных сущностей зачем то опять идет в базу и достает их оттуда построчно и потом так же построчно апдейтит
21 июл 21, 11:42    [22349275]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
andreykaT,

А тебе? Ты же два слова связать не можешь.
Обычно троечники возмущаются отличниками)
21 июл 21, 11:44    [22349277]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3434
PetroNotC Sharp
andreykaT,

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

а мне не сказали. читай заголовки в следующий раз внимательнее.
21 июл 21, 11:48    [22349279]     Ответить | Цитировать Сообщить модератору
 Re: Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8651
O_79_O,
>имея список перстистеных сущностей зачем то опять идет в базу и достает их оттуда построчно и потом так же построчно апдейтит
=
А) проверить версию в бд сучности
Б) хибер не имеет список при коротких транзакциях.
21 июл 21, 11:48    [22349280]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Java Ответить