|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Господа, при работе с HIbernate возникла следующая проблема, которая мне, мягко говоря не понятна. У меня есть два класса: Справочник кодов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
и Информация о клиенте. Отношение кодов к клиентам Много ко многим. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
При добавлении кода в коллекцию, и затем сохранения главного объекта Код: plaintext 1. 2.
У меня получается следующий SQL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
То есть Hibernate мне зачем-то полностью удаляет все дочерние записи, а потом вставляет их заново, но уже изменённые. Это нормально? Есть какие-то способы заставить его вносить только изменения а не просто перезаписывать всё? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2007, 20:36 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Убери @Cascade(value = { CascadeType.SAVE_UPDATE }) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2007, 20:49 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
меня реально задрал этот антипаттерн: http://forum.hibernate.org/viewtopic.php?t=977710 http://sql.ru/forum/actualthread.aspx?tid=453741&hl=manytomany+update+delete+insert hiber и DAO очень разные вещи. если тут Код: plaintext
то второй раз Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 10:32 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
someone1Убери @Cascade(value = { CascadeType.SAVE_UPDATE }) ? Не помогает exppменя реально задрал этот антипаттерн: Я не много не понял, о чём вы. Поиграл с CascadeType - везде один и тот же результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 13:13 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Angel13 Я не много не понял, о чём вы. Код: plaintext
чаепор а рыкефйрфк фкнынй4цефукпф фп вапи ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 14:07 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
expp dao.update(profile); - убери Не обращайте внимание на название dao :) Это его какой-то нерадивый программист так обозвал. на самом деле это к DAO паттерну никакого отношения не имеет. Там внутри просто вызывается метод session.saveOrUpdate(profile); Посему - не могу его убрать, так как именно он сохраняет данные в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 15:14 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
1. шо происходит тута Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 15:44 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Angel13... внутри просто вызывается метод session.saveOrUpdate(profile); Посему - не могу его убрать, так как именно он сохраняет данные в БД. все зависит от того в каком у вас состоянии объект profile, если в persitent состоянии то dirty checking происходит автоматом и вам не нужно вызывать saveOrUpdate. Этот метод предназначен для перевода из состония detached в persistent. Вообще честно говоря hibernate это чуть ли не единственная технология, которые многие начинают использовать, даже не понимая и не пытаясь понять как он работает, прочитав step by step и замапив таблицу на класс, после этого процесс обучения прекращается. И потом начинаются вопросы "Почему мое приложение не летает? Ну и фиговая же у hibernate производитьльность". Почему то никто не задает вопросы "Я не знаю что такое sql и oracle, но почему мое приложение работает так медленно?" ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 15:52 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
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. сохраняю объект. При этом он мне так странно(см. выше) сохраняет коллекции. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 16:06 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
так чувак ты до конца меня достал ... когда ты достал объект из сессии авторsession.createQuery("...").uniqueResult(); теперь она думает о нём. тебе уже не надо. меняешь коллекцию. изменения попадут в базу при flushе по commit'у транзакции (jta). ты можешь принудительно его вызвать. не надо вызывать Код: plaintext
чем тебе не приглянулся dirty check? и учти что хибер-style сильно отличается от Oracle/SQL. оно тебе надо 7 мош ну его ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 16:34 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
expp изменения попадут в базу при flushе по commit'у транзакции Допустим. Но коллекция попадёт в БД опять таки так: сначала delete всех строк в таблице связей а потом Insert их снова. Код: plaintext 1. 2.
Вот это проблема! expp и учти что хибер-style сильно отличается от Oracle/SQL. оно тебе надо 7 мош ну его ? Производственная необходимость :( ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 16:45 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Какая версия хибера? не уверен, но он либо не умеет обновлять коллекции частично, либо научился делать это недавно. могу ошибаться, я с ним не работал. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 16:59 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
ботва какаято . показывай исходники сущностей, тест, лог . не понял insert/delete sql в логе есть ? и не надо ля ля всё он делает так что ... зашибись ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 17:09 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
exppботва какаято . показывай исходники сущностей, тест, лог . не понял insert/delete sql в логе есть ? и не надо ля ля всё он делает так что ... зашибись а польку сплясать могёт? PS. невозможность обновить коллекцию может быть вызвана, к примеру, отсутствием PK на таблице-связке. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 17:12 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
expp показывай исходники сущностей, тест, лог . не понял insert/delete sql в логе есть ? Исходники сущностей в первом посте. Вырезка из Лога там же. delete/insert там есть :( Timm PS. невозможность обновить коллекцию может быть вызвана, к примеру, отсутствием PK на таблице-связке. В приложении структура таблиц. PK на таблице связке есть (сделан как autoincrement поле). Но Хибернейт о нём, судя по всему не знает. Где ему это указать? Hibernate 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 17:35 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
м.б. @IndexColumn(name="interest_codes_id")? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 18:21 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
оочень странные байки... варианты использовать Set и мапить ассоц таблицу руками. завтра проверю... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2007, 19:07 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
использование Setа мне помогло. объяснение авторBags are the worst case.... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2007, 10:01 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Timm@IndexColumn(name="interest_codes_id") Помогло!! Спасибо! Теперь только мне не понятна работа Hibernate с полем interest_codes_id. Он явно не использует Сиквенс. Надеюсь что он не делает max() +1. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2007, 12:16 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Angel13Теперь только мне не понятна работа Hibernate с полем interest_codes_id. Он явно не использует Сиквенс. Надеюсь что он не делает max() +1. Ну, можно включить дебаг для statements+binds и поглядеть. http://www.javalobby.org/java/forums/t44119.html ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2007, 12:22 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Оставляю информацию для потомков: в таблице Код: plaintext 1. 2. 3. 4. 5.
пришлось поменять 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2007, 12:51 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
@IndexColumn() определяет колонку в которой храниться индекс элементов списка. думаю это не совсем то чего следует хотеть ManyToMany стоит мапить : - Set ом с прямой стороны Collection c инверсной (та которая mappedBy) - если же bag (Collection ) с обоих сторон (получаем полное удаление и вставку всей коллекции) то стоит использовать ColumnId. тем самым объявляя коллекцию idbag ом. ColumnId определяет первичный ключ для ассоциативной таблицы, как и хотел Анхел13. работает это прикольно, например если для пары объектов разрываем такое отношение, а для пары вставляем - получаем только один update ассоциативной таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2007, 11:36 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
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.
объект вытащили из сессии (или вставили) то второй раз Код: java 1.
это делать не надо Ооо, спасибо большое. А я то думаю, чё у меня за ошибка. ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 01:44 |
|
Hibernate обновление коллекции
|
|||
---|---|---|---|
#18+
Angel13При добавлении кода в коллекцию, и затем сохранения главного объекта Код: java 1. 2. 3.
Здесь важно, как создаётся profile. Если это new, то всё логично - в нём нет старых связей и к нему добавляются новые, в итоге хибер удаляет старые и добавляет новые. Если же получение в транзакции от хибера - совсем другая песня. Так что надо показывать подробно, а не "как мне кажется". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 11:48 |
|
|
start [/forum/topic.php?fid=59&msg=34686814&tid=2121382]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 364ms |
total: | 523ms |
0 / 0 |