powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
25 сообщений из 164, страница 3 из 7
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085120
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
Вообще важно. Если бы у тебя был Spring Boot, то по умолчанию он сконфигурил бы OpenEntityManagerInViewInterceptor и тогда сессия (EntityManager) создалась бы до контроллера. В таком случае проблемы с лишними select'ами не было бы потому как объекты бы были в сессии уже. Это все равно было бы неправильно (тут явно нужна одна транзакция), но select'ов бы не было. В обычном Spring MVC надо OSIV настраивать самому, причем можно фильтром а не интерсептором (и это лучше чем неявная конфигурация SpringBoot'ом).

А вот в тесте никто бы сессию не открыл без @Transactional. Разве что это RestAssured и/или MockMvc тесты.


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

не нужно убеждаться это в учебнике написано
что хибер каждый запрос выполняет в рамках отдельной тразакции( читай хибер сессии)
чтобы хибер выполнил несколько запросов в рамках одной транзакции нужно хиберу об этом соообщить анотацией @Transactional
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085124
O_79_O
Stanislav Bashkyrtsev
Вообще важно. Если бы у тебя был Spring Boot, то по умолчанию он сконфигурил бы OpenEntityManagerInViewInterceptor и тогда сессия (EntityManager) создалась бы до контроллера. В таком случае проблемы с лишними select'ами не было бы потому как объекты бы были в сессии уже. Это все равно было бы неправильно (тут явно нужна одна транзакция), но select'ов бы не было. В обычном Spring MVC надо OSIV настраивать самому, причем можно фильтром а не интерсептором (и это лучше чем неявная конфигурация SpringBoot'ом).

А вот в тесте никто бы сессию не открыл без @Transactional. Разве что это RestAssured и/или MockMvc тесты.


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

не нужно убеждаться это в учебнике написано
что хибер каждый запрос выполняет в рамках отдельной тразакции( читай хибер сессии)
чтобы хибер выполнил несколько запросов в рамках одной транзакции нужно хиберу об этом соообщить анотацией @Transactional
в курсе. Я говорил про ОДИН метод.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085127
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
O_79_O
пропущено...


ты ошибаешься,потому что у меня как раз таки спринг бут
не путай сессию хибера и http сессию они не взаимосвязаны
Если бут, тогда не понятно почему OSIV не включен. Он включается по умолчанию.

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

не нужно убеждаться это в учебнике написано
что хибер каждый запрос выполняет в рамках отдельной тразакции( читай хибер сессии)
чтобы хибер выполнил несколько запросов в рамках одной транзакции нужно хиберу об этом соообщить анотацией @Transactional
в курсе. Я говорил про ОДИН метод.

как ты видешь из кода все в рамках одного метода и происходит
собственно смысл дальще об этом говорить если Олег указал что и где и почему не так.

Давайте я подкину новую историю из этой же темы,она также довольно интересна
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085129
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз.
Поставь рядом findAll и сохранить. И убедись что они в разных сессиях.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085131
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
Не надо новых. Покажи что аннотация уменьшила запросы.
Добивай вопрос до конца.
Не скользи.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085133
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
O_79_O,
Не надо новых. Покажи что аннотация уменьшила запросы.
Добивай вопрос до конца.
Не скользи.

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

но есть еще один кейс, я изменил сучность A

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@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;

  @OneToMany(mappedBy = B_.A,cascade = CascadeType.ALL)
  List<B> bList;


}



добавил вторую сучность B

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

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

  private String name;

  private Long aId;

  @ManyToOne
  @JoinColumn(name=B_.A_ID,insertable = false,updatable = false)
  private A a;
}



далее я генерирую сучности A и добвляю к ним в колекцию сучности В

Код: 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.
@Service
public class BatchTestingService {

  private List<B> getTestListB() {
    List<B> bList = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
      B b = new B();
      b.setName("b" + i);
      bList.add(b);

    }
    return bList;
  }

  public List<A>getTestListA(){
    List<A> aList = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
      A a = new A();
      a.setName("a" + i);
      a.setBList(getTestListB());
      aList.add(a);

    }
    return aList;
  }

  }




далее я записываю все это в базу данных

Код: java
1.
2.
3.
4.
5.
6.
7.
 @Transactional
  @PostMapping
  public String saveAllTest(){
    var list=batchTestingService.getTestListA();
    aRepository.saveAll(list);
    return "OK";
  }



что я ожидаю что появится 50 записей в таблице A
и по 2500 записей в таблице B ,при этом в каждой из записей в колонке a_id будет так же заполнена

но этого не происходит- обе таблицы заполняются записям но колонка a_id в таблице B всегда null

я понимаю что это происходит потому что на этапе комита у хибера еше нет id сучности А,так как стратегия генерации ПК у нас секвенс.Это можно исправить поменяв стратегию на Identity - тогда FK будут корректно записываться в таблицу В
но у меня как раз в том и состоит задача - чтобы убрать Identity

вопрос к знатокам - если способ какой исправить ситуацию и каскадно записывать эти две сучности

ддл таблиц


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create sequence a_id_seq increment 50;
create sequence b_id_seq;
create table A(
  id bigint DEFAULT nextval('a_id_seq') primary key ,
  name text
);

create table B(
  id bigint DEFAULT nextval('b_id_seq') primary key,
  name text,
  a_id bigint references a on delete cascade

)
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085164
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
Для каждой сучности свой сиквенс + он в аннотации + все одинаковый режим.
Выполняется?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085165
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
2) убрать цикл и сделать без него
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085166
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
3)нафиг базу ломать своим increment 50. Убери.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085169
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
O_79_O,
3)нафиг базу ломать своим increment 50. Убери.


чтобы не бегать в бд за каждый ID а так если подсказть хиберу что sequence генерятся интервалом 50 он дернет раз получит 100, а дальше сам внутри приращением 49 новых записей сможет сделать.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085170
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
O_79_O,
3)нафиг базу ломать своим increment 50. Убери.

если убрть инкремент будем делать кучу селектов
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085171
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,
Он сиквенс для приложений предприятия нарисовал.
Я бы не.
Он что, пуп земли со своим хибером?
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085172
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O
PetroNotC Sharp
O_79_O,
3)нафиг базу ломать своим increment 50. Убери.

если убрть инкремент будем делать кучу селектов
другие решения ищи. Убери цикл!
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085173
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
O_79_O,
И сиквенс afaik не пишется внутри ddl table
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085176
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
другие решения ищи. Убери цикл!

чем тебе цикл не нравится - там лишь генерятся сущности,он тут вообще никаким боком ни кому не мешает

генерится сущность А - в нее добавляется список с сущностями В
при записи в бд сущности B не получают запись в поле a_id которое является ссылкой на пк из таблицы А
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085177
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,generator = "ID_GENERATOR")
  @SequenceGenerator(name="ID_GENERATOR",sequenceName = "a_id_seq")
  private Long id;

  private String name;

  @OneToMany(mappedBy = B_.A,fetch = FetchType.LAZY,cascade = CascadeType.ALL)
  List<B> bList;
  
}



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

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

  private String name;

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



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

чем тебе цикл не нравится - там лишь генерятся сущности,он тут вообще никаким боком ни кому не мешает

генерится сущность А - в нее добавляется список с сущностями В
при записи в бд сущности B не получают запись в поле a_id которое является ссылкой на пк из таблицы А
я анализирую. У тебя почти все вопросы про все на свете.
Декомпозиция. Учись.
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085183
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы дождемся отношений двух классов. Как пример?)))))
...
Рейтинг: 0 / 0
Реквестируем отличников по Хибернейт в тред,петро и ваде вход воспрещен)
    #40085184
O_79_O
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
Мы дождемся отношений двух классов. Как пример?)))))

выше все есть и ддл и сущности

Петро ,ну не хватает знаний - хоть гугли вместе со мной

вот решение этой проблемы,ddl не меняется - меняем сущности

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@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;

  @OneToMany(targetEntity = B.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "a_id", nullable = false)
  List<B> bList;

}



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

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

  private String name;
  
}



теперь все пишется корректно и батчится
Код: java
1.
2.
3.
 1824200 nanoseconds spent preparing 54 JDBC statements;
    127689200 nanoseconds spent executing 51 JDBC statements;
    21552140300 nanoseconds spent executing 11 JDBC batches;



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


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