powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate обновление коллекции
25 сообщений из 25, страница 1 из 1
Hibernate обновление коллекции
    #34684199
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа,

при работе с HIbernate возникла следующая проблема, которая мне, мягко говоря не понятна.

У меня есть два класса:

Справочник кодов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
@Table(name="INTEREST_CODE_DICT")
 public   class  InterestCodesDict  implements  Serializable
{
	@Id
	@Column(name = "CODE_ID")
	 private   Long  codeId;
....
}

и Информация о клиенте. Отношение кодов к клиентам Много ко многим.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Entity
@Table(name = "CUSTOMER_PROFILE")
@SequenceGenerator(name = "profile_error_seq", sequenceName = "PROFILE_ERROR_SEQ")
@org.hibernate.annotations.Proxy(lazy = true)
 public   class  CustomerProfile {
	@Id
	@Column(name = "CUSTOMER_PROFILE_ID")
	 private   Long  customerProfileId;
....
	@ManyToMany
	@JoinTable(name = "INTEREST_CODES", joinColumns = { @JoinColumn(name = "CUSTOMER_PROFILE_ID") }, inverseJoinColumns = { @JoinColumn(name = "INTEREST_DICT_ID") })
	@Cascade(value = { CascadeType.SAVE_UPDATE })
	 private  List<InterestCodesDict> interestCodes =  new  ArrayList<InterestCodesDict>();
}


При добавлении кода в коллекцию, и затем сохранения главного объекта
Код: plaintext
1.
2.
CustomerProfile profile = ...;		
profile.getInterestCodes().add(...);
dao.update(profile);

У меня получается следующий SQL

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
delete from public.INTEREST_CODES where CUSTOMER_PROFILE_ID=?
DEBUG[AbstractCollectionPersister.remove] done deleting collection
DEBUG[AbstractCollectionPersister.recreate] Inserting collection: 
DEBUG[SQL.log] insert into public.INTEREST_CODES (CUSTOMER_PROFILE_ID, INTEREST_DICT_ID) values (?, ?)
DEBUG[AbstractBatcher.prepareBatchStatement] reusing prepared statement
DEBUG[SQL.log] insert into public.INTEREST_CODES (CUSTOMER_PROFILE_ID, INTEREST_DICT_ID) values (?, ?)
DEBUG[AbstractBatcher.prepareBatchStatement] reusing prepared statement
DEBUG[SQL.log] insert into public.INTEREST_CODES (CUSTOMER_PROFILE_ID, INTEREST_DICT_ID) values (?, ?)
DEBUG[AbstractBatcher.prepareBatchStatement] reusing prepared statement
DEBUG[SQL.log] insert into public.INTEREST_CODES (CUSTOMER_PROFILE_ID, INTEREST_DICT_ID) values (?, ?)
DEBUG[AbstractBatcher.prepareBatchStatement] reusing prepared statement
DEBUG[SQL.log] insert into public.INTEREST_CODES (CUSTOMER_PROFILE_ID, INTEREST_DICT_ID) values (?, ?)

То есть Hibernate мне зачем-то полностью удаляет все дочерние записи, а потом вставляет их заново, но уже изменённые. Это нормально?
Есть какие-то способы заставить его вносить только изменения а не просто перезаписывать всё?
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34684218
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убери @Cascade(value = { CascadeType.SAVE_UPDATE }) ?
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34684916
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
меня реально задрал этот антипаттерн: http://forum.hibernate.org/viewtopic.php?t=977710 http://sql.ru/forum/actualthread.aspx?tid=453741&hl=manytomany+update+delete+insert

hiber и DAO очень разные вещи.

если тут
Код: plaintext
CustomerProfile profile = ...;
объект вытащили из сессии (или вставили)

то второй раз
Код: plaintext
dao.update(profile);
это делать не надо
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34685624
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someone1Убери @Cascade(value = { CascadeType.SAVE_UPDATE }) ?
Не помогает
exppменя реально задрал этот антипаттерн:
Я не много не понял, о чём вы.

Поиграл с CascadeType - везде один и тот же результат.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34685879
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13
Я не много не понял, о чём вы.

Код: plaintext
dao.update(profile);
- убери

чаепор а рыкефйрфк фкнынй4цефукпф фп вапи
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686243
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expp
dao.update(profile);

- убери



Не обращайте внимание на название dao :) Это его какой-то нерадивый программист так обозвал. на самом деле это к DAO паттерну никакого отношения не имеет. Там внутри просто вызывается метод
session.saveOrUpdate(profile); Посему - не могу его убрать, так как именно он сохраняет данные в БД.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686383
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. шо происходит тута
Код: plaintext
CustomerProfile profile = ...;		
2. убери его нах
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686417
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13... внутри просто вызывается метод
session.saveOrUpdate(profile); Посему - не могу его убрать, так как именно он сохраняет данные в БД. все зависит от того в каком у вас состоянии объект profile, если в persitent состоянии то dirty checking происходит автоматом и вам не нужно вызывать saveOrUpdate. Этот метод предназначен для перевода из состония detached в persistent.

Вообще честно говоря hibernate это чуть ли не единственная технология, которые многие начинают использовать, даже не понимая и не пытаясь понять как он работает, прочитав step by step и замапив таблицу на класс, после этого процесс обучения прекращается. И потом начинаются вопросы "Почему мое приложение не летает? Ну и фиговая же у hibernate производитьльность".

Почему то никто не задает вопросы "Я не знаю что такое sql и oracle, но почему мое приложение работает так медленно?"
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686488
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0
Почему то никто не задает вопросы "Я не знаю что такое sql и oracle, но почему мое приложение работает так медленно?"

У меня достаточно много опыта работы с Oracle и SQL :) собственно говоря это моя специальность. Но так получилось что пришлось кодить на JAVA. Поверьте, мне самому дико видеть в комментариях по Hibernate, что "это технология позволяет разработчику вообще не думать о БД" (с).


vas0все зависит от того в каком у вас состоянии объект profile, если в persitent состоянии то dirty checking происходит автоматом и вам не нужно вызывать saveOrUpdate. Этот метод предназначен для перевода из состония detached в persistent.
dirty checking меня не устраивает.

expp
шо происходит тута
CustomerProfile profile = ...;

Тут я поднимаю из БД объект типа CustomerProfile, при помощи session.createQuery("...").uniqueResult();
expp
2. убери его нах

Ну не могу я убрать это :)
Смысл такой:
1. я загружаю объект.
2. изменяю в нём коллекцию (и другие параметры)
3. сохраняю объект.

При этом он мне так странно(см. выше) сохраняет коллекции.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686612
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так чувак ты до конца меня достал ...

когда ты достал объект из сессии авторsession.createQuery("...").uniqueResult();

теперь она думает о нём. тебе уже не надо. меняешь коллекцию. изменения попадут в базу при flushе по commit'у транзакции (jta). ты можешь принудительно его вызвать.

не надо вызывать
Код: plaintext
update()
для хибера это нечто иное чем ты вообразил.

чем тебе не приглянулся dirty check?

и учти что хибер-style сильно отличается от Oracle/SQL. оно тебе надо 7 мош ну его ?
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686665
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expp
изменения попадут в базу при flushе по commit'у транзакции

Допустим.
Но коллекция попадёт в БД опять таки так:
сначала delete всех строк в таблице связей
а потом Insert их снова.
Код: plaintext
1.
2.
DEBUG[AbstractCollectionPersister.remove] done deleting collection
DEBUG[AbstractCollectionPersister.recreate] Inserting collection: 

Вот это проблема!

expp
и учти что хибер-style сильно отличается от Oracle/SQL. оно тебе надо 7 мош ну его ?

Производственная необходимость :(
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686747
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия хибера?
не уверен, но он либо не умеет обновлять коллекции частично, либо научился делать это недавно.
могу ошибаться, я с ним не работал.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686800
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ботва какаято .
показывай исходники сущностей, тест, лог .

не понял insert/delete sql в логе есть ?

и не надо ля ля всё он делает так что ... зашибись
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686814
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppботва какаято .
показывай исходники сущностей, тест, лог .

не понял insert/delete sql в логе есть ?

и не надо ля ля всё он делает так что ... зашибись
а польку сплясать могёт?
PS. невозможность обновить коллекцию может быть вызвана, к примеру, отсутствием PK на таблице-связке.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34686929
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expp
показывай исходники сущностей, тест, лог .

не понял insert/delete sql в логе есть ?

Исходники сущностей в первом посте. Вырезка из Лога там же. delete/insert там есть :(

Timm
PS. невозможность обновить коллекцию может быть вызвана, к примеру, отсутствием PK на таблице-связке.

В приложении структура таблиц. PK на таблице связке есть (сделан как autoincrement поле). Но Хибернейт о нём, судя по всему не знает. Где ему это указать?

Hibernate 3.0
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34687101
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
м.б. @IndexColumn(name="interest_codes_id")?
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34687258
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оочень странные байки...

варианты использовать Set и мапить ассоц таблицу руками.

завтра проверю...
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34687894
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использование Setа мне помогло. объяснение
авторBags are the worst case....
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34688477
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm@IndexColumn(name="interest_codes_id")

Помогло!! Спасибо!

Теперь только мне не понятна работа Hibernate с полем interest_codes_id. Он явно не использует Сиквенс. Надеюсь что он не делает max() +1.
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34688502
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13Теперь только мне не понятна работа Hibernate с полем interest_codes_id. Он явно не использует Сиквенс. Надеюсь что он не делает max() +1.
Ну, можно включить дебаг для statements+binds и поглядеть.
http://www.javalobby.org/java/forums/t44119.html
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34688664
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оставляю информацию для потомков:

в таблице
Код: plaintext
1.
2.
3.
4.
5.
create table interest_codes (
   interest_codes_id    serial not null,
   customer_profile_id  int8                 null,
   interest_dict_id     int8                 null,
   constraint interest_codes_id_pk primary key (interest_codes_id)
);

пришлось поменять PK с interest_codes_id на пару (customer_profile_id, interest_dict_id ), потому что interest_codes_id hibernate генерит уникальным только в рамках одного значения customer_profile_id.

Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 0 ; 661 ; 5 
 1 ; 661 ; 21 
 2 ; 661 ; 17 
 3 ; 661 ; 12 
 4 ; 661 ; 19 
 5 ; 661 ; 24 
 0 ; 660 ; 12 
 1 ; 660 ; 19 
 2 ; 660 ; 24 
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34709974
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@IndexColumn() определяет колонку в которой храниться индекс элементов списка. думаю это не совсем то чего следует хотеть

ManyToMany стоит мапить :

- Set ом с прямой стороны Collection c инверсной (та которая mappedBy)

- если же bag (Collection ) с обоих сторон (получаем полное удаление и вставку всей коллекции) то стоит использовать ColumnId. тем самым объявляя коллекцию idbag ом. ColumnId определяет первичный ключ для ассоциативной таблицы, как и хотел Анхел13.
работает это прикольно, например если для пары объектов разрываем такое отношение, а для пары вставляем - получаем только один update ассоциативной таблицы
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #34710058
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Hibernate обновление коллекции
    #39798466
SurvOrDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exppменя реально задрал этот антипаттерн: http://forum.hibernate.org/viewtopic.php?t=977710 https://www.sql.ru/forum/actualthread.aspx?tid=453741&hl=manytomany update delete insert

hiber и DAO очень разные вещи.

если тут
Код: java
1.
CustomerProfile profile = ...;

объект вытащили из сессии (или вставили)

то второй раз
Код: java
1.
dao.update(profile);

это делать не надо
Ооо, спасибо большое. А я то думаю, чё у меня за ошибка. )))
...
Рейтинг: 0 / 0
Hibernate обновление коллекции
    #39798639
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13При добавлении кода в коллекцию, и затем сохранения главного объекта
Код: java
1.
2.
3.
CustomerProfile profile = ...;		
profile.getInterestCodes().add(...);
dao.update(profile);


Здесь важно, как создаётся profile. Если это new, то всё логично - в нём нет старых связей и к нему добавляются новые, в итоге хибер удаляет старые и добавляет новые. Если же получение в транзакции от хибера - совсем другая песня. Так что надо показывать подробно, а не "как мне кажется".
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate обновление коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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