![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| sith |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 11.2.2007 Репутация: нет Всего: 1 |
подскажите пожалуйста... я работаю с хибирнейтом - как удалить строку передав ему лишь ее ID. Сейчас, как по мне, оно работатет не совсем логично... я сначала должен получить обьект строки которой хочу удалить... а потом лишь передать методу delete, его... можно ли проще... без предварительного обрщания в БД?
-------------------- Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!! |
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 14 Всего: 104 |
-------------------- Lost.... |
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
Если нужно просто и без затей удалить запись то можно воспользоватся:
SQLQuery q = session.createSQLQuery("delete from A where b=?"); q.setInteger(id); q.execudeUpdate(); просто и без затей. можно конечно поизвращатся еще посильнее, правда не увреен что сработает - создать объект новый, присвоить ему айди и заставить хибернат удалить его. -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 14 Всего: 104 |
Хитро, но вроде не сработает -------------------- Lost.... |
|||
|
||||
| sith |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 11.2.2007 Репутация: нет Всего: 1 |
поля обязательные для заполнения в таком варианте придеться все равно запонять... он выругается на это
-------------------- Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!! |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Я вообще считаю, что любые ОРМы, в том числе и кибернет, изначально предполагают, что единицей действия является объект, т.е. предполагается, что какая-то работа с некой частью объекта не допустима: объект должен целиком загружаться и целиком сохранятся, ну и, по аналогии, целиком удаляться, т.е. достать объект целиком и удалить - это нормально.
Если вдруг возникают какие-либо проблеммы в этой области, то значит не правильно спроектированна структура доменных классов. Например, если вдруг объект слишком большой и при его удалении тратить много ресурсов на его загрузку не целесообразно, то это значит, что этот объект необходимо разделить на более мелкие - класс этого объекта содержит в себе слишком много понятий. А напрямую удалять запись объекта через SQL-команды не корректно: может нарушиться ссылочная целостность. А отслеживать ссылочную целостность - глупо: библиотека кибернет специально создавалась, чтобы программист не заботился о ссылочной целостности. Это сообщение отредактировал(а) pompei - 15.2.2008, 11:53 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| iluvatar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 266 Регистрация: 17.9.2007 Репутация: 4 Всего: 4 |
а вариант, предложенный necromancer чем вас не устраивает? объект в таком случае загружаться не будет.
|
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
А напрямую удалять запись объекта через SQL-команды не корректно: может нарушиться ссылочная целостность. А отслеживать ссылочную целостность - глупо: библиотека кибернет специально создавалась, чтобы программист не заботился о ссылочной целостности. --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| mindflyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 20.10.2004 Где: Smolensk, Russia Репутация: 3 Всего: 4 |
А смысл? Хибернейт ведь не от хорошей жизни предпочитает подгрузку перед удалением - это сделано для того, чтобы можно было корректно отработать всякие каскадные действия при удалении, обновить кэш и прочее. В простейшем случае можно удалить SQL запросом. Но, если много связей между объектами, то лучше сначала загрузить объект и потом удалять его - в этом случае имеем гарантию сохранения согласованности данных и в бд и в кэше. Если быстродействие не удовлетворяет - можно поиграться с маппингом, там есть возможность задания каскадного удаления на уровне СУБД, но с некоторыми ограничениями (детально не разбирался). У нас так и сделано - везде удаление через предварительную подгрузку, в критичных местах - всякие ухищрения. |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Я вообще считаю, что оптимизировать удаление не нужно - это достаточно редкая операция. В некоторых больших системах такой операции вообще нет, например, в тех, где ведётся история операций.
ЗЫ. "Оптимизировать во время реализации - вредно для здоровья" (С) Мартин Фаулер --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| mindflyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 20.10.2004 Где: Smolensk, Russia Репутация: 3 Всего: 4 |
Ситуации и большие системы бывают разные И это действие активируемое пользователем. А есть ещё массивные операции по расписанию - где удаляются и вставляются миллионы записей, естественно, здесь удаление идёт в обход хибернейта. Это сообщение отредактировал(а) mindflyer - 15.2.2008, 13:10 |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Выб не могли бы расказать о системе в общих чертах?
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| mindflyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 20.10.2004 Где: Smolensk, Russia Репутация: 3 Всего: 4 |
Это не имеет отношения к теме, ну да ладно. ПО для туристических агенств/операторов. Откуда массивные операции удаления/вставки: 1) многие операторы предоставляют для ускорения доступа к своим продуктам (в частности, самолётам) файлы с описаниями (краткая информация, необходимая для поиска). Ежедневно выкладывают на ftp. Наша система также ежедневно забирает их и кладёт в локальную базу, для поисков. Записей каждый день несколько миллионов, их проще и быстрее все убивать и создавать новые, чем апдейтить существующие. 2) опять таки с целью ускорения поисков создаётся множество записей с пред рассчитанными ценами для всяких частных случаев - при изменениях в бизнесс-данных быстрее грохнуть старые и создать новые записи, нежели апдейтить существующие. Таких записей тоже миллионы, в перспективе - десятки и сотни миллионов. На этапе поиска удобнее работать через хибернейт, при обновлении данных - голый SQL. |
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
вставлю и свои пять копеек =)
при использовании связей удаление через скл не оправдано. Хотя есть ньюанс. Предположим у нас огромное число записей и необходимо произвести обновление одного поля по опереденному параметру. Если под этот параметр попадает не много записей (относительно бд) то хибернейт справится нормально, а если их много? то вы представляете вытащить миллион записей и заапдейтить их обратно? хотя это можно сделать 1 скл запросом?. далее на момент работы хибернаты, необходимо поддерживать транзакционность. т.е. пока вы будете вытаскивать эти много записей, остальные клиенты должны курить в сторонке? Вывод: использовать хибер тогда когда это нада, и не сувать его во все щели. использование чистого скл оправдано в целях ускорения операций. поиска. вызова процедур. поддержки транзакционности на распереденных системах. Личто мое мнение: ОРМ хорош когда нужно встаивть запись, иногда в простейших случаях получить обратно. удалить эту же запись.Чуть что более сложное не гнушайтесь использовать скл. Есть возражение что хибер не зависит от базы а скл зависит - брехня. Возьмите blob в Oracle и MySQL и как говорится почувствуйте разницу. Добавлено через 2 минуты и 27 секунд
Все правильно - пусть этим занимается как минимум база данных. А хибернат пусть ей в этом помогает. Аминь. -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |