Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление строки в таблице по id, Hibirnate 
:(
    Опции темы
sith
Дата 14.2.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



подскажите пожалуйста... я работаю с хибирнейтом - как удалить строку передав ему лишь ее ID.  Сейчас, как по мне, оно работатет не совсем логично... я сначала должен получить обьект строки которой хочу удалить... а потом лишь передать методу delete, его... можно ли проще... без предварительного обрщания в БД?


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
Kangaroo
Дата 14.2.2008, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Нельзя удалить по ID. Только достав объект из базы.
Вот почитай тут


--------------------
Lost....
PM MAIL MSN   Вверх
necromancer
Дата 15.2.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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/
PM MAIL WWW ICQ Skype   Вверх
Kangaroo
Дата 15.2.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(necromancer @  14.2.2008,  23:29 Найти цитируемый пост)
создать объект новый, присвоить ему айди и заставить хибернат удалить его. 

Хитро, но вроде не сработает  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
sith
Дата 15.2.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



поля обязательные для заполнения в таком варианте придеться все равно запонять... он выругается на это


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
pompei
Дата 15.2.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Я вообще считаю, что любые ОРМы, в том числе и кибернет, изначально предполагают, что единицей действия является объект, т.е. предполагается, что какая-то работа с некой частью объекта не допустима: объект должен целиком загружаться и целиком сохранятся, ну и, по аналогии, целиком удаляться, т.е. достать объект целиком и удалить - это нормально.

Если вдруг возникают какие-либо проблеммы в этой области, то значит не правильно спроектированна структура доменных классов. Например, если вдруг объект слишком большой и при его удалении тратить много ресурсов на его загрузку не целесообразно, то это значит, что этот объект необходимо разделить на более мелкие - класс этого объекта содержит в себе слишком много понятий.

А напрямую удалять запись объекта через SQL-команды не корректно: может нарушиться ссылочная целостность. А отслеживать ссылочную целостность - глупо: библиотека кибернет специально создавалась, чтобы программист не заботился о ссылочной целостности.


Это сообщение отредактировал(а) pompei - 15.2.2008, 11:53
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
iluvatar
Дата 15.2.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



а вариант, предложенный necromancer чем вас не устраивает? объект в таком случае загружаться не будет.
PM MAIL ICQ   Вверх
pompei
Дата 15.2.2008, 11:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6




А напрямую удалять запись объекта через SQL-команды не корректно: может нарушиться ссылочная целостность. А отслеживать ссылочную целостность - глупо: библиотека кибернет специально создавалась, чтобы программист не заботился о ссылочной целостности.
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
mindflyer
Дата 15.2.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 3
Всего: 4



Цитата(sith @  14.2.2008,  01:21 Найти цитируемый пост)
Сейчас, как по мне, оно работатет не совсем логично

Цитата(necromancer @  15.2.2008,  00:29 Найти цитируемый пост)
создать объект новый, присвоить ему айди и заставить хибернат удалить его. 


А смысл? Хибернейт ведь не от хорошей жизни предпочитает подгрузку перед удалением - это сделано для того, чтобы можно было корректно отработать всякие каскадные действия при удалении, обновить кэш и прочее. 
В простейшем случае можно удалить SQL запросом. Но, если много связей между объектами, то лучше сначала загрузить объект и потом удалять его - в этом случае имеем гарантию сохранения согласованности данных и в бд и в кэше. Если быстродействие не удовлетворяет - можно поиграться с маппингом, там есть возможность задания каскадного удаления на уровне СУБД, но с некоторыми ограничениями (детально не разбирался). У нас так и сделано - везде удаление через предварительную подгрузку, в критичных местах - всякие ухищрения.


PM MAIL ICQ   Вверх
pompei
Дата 15.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Я вообще считаю, что оптимизировать удаление не нужно - это достаточно редкая операция. В некоторых больших системах такой операции вообще нет, например, в тех, где ведётся история операций.

ЗЫ. "Оптимизировать во время реализации - вредно для здоровья" (С) Мартин Фаулер

--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
mindflyer
Дата 15.2.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 3
Всего: 4



Цитата(pompei @  15.2.2008,  12:03 Найти цитируемый пост)
Я вообще считаю, что оптимизировать удаление не нужно - это достаточно редкая операция. В некоторых больших системах такой операции вообще нет, например, в тех, где ведётся история операций.

Ситуации и большие системы бывают разные smile У нас в одном довольно частом use-case удаление стандартным способом длится почти 3 минуты. С ухищрениями - менее 30 секунд. История изменений у нас таки ведётся smile 
И это действие активируемое пользователем. А есть ещё массивные операции по расписанию - где удаляются и вставляются миллионы записей, естественно, здесь удаление идёт в обход хибернейта.

Это сообщение отредактировал(а) mindflyer - 15.2.2008, 13:10
PM MAIL ICQ   Вверх
pompei
Дата 15.2.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Выб не могли бы расказать о системе в общих чертах?
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
mindflyer
Дата 15.2.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 3
Всего: 4



Цитата(pompei @  15.2.2008,  13:47 Найти цитируемый пост)
Вы не могли бы рассказать о системе в общих чертах?

Это не имеет отношения к теме, ну да ладно. ПО для туристических агенств/операторов. Откуда массивные операции удаления/вставки:
1) многие операторы предоставляют для ускорения доступа к своим продуктам (в частности, самолётам) файлы с описаниями (краткая информация, необходимая для поиска). Ежедневно выкладывают на ftp. Наша система также ежедневно забирает их и кладёт в локальную базу, для поисков. Записей каждый день несколько миллионов, их проще и быстрее все убивать и создавать новые, чем апдейтить существующие.
2) опять таки с целью ускорения поисков создаётся множество записей с пред рассчитанными ценами для всяких частных случаев - при изменениях в бизнесс-данных быстрее грохнуть старые и создать новые записи, нежели апдейтить существующие. Таких записей тоже миллионы, в перспективе - десятки и сотни миллионов.

На этапе поиска удобнее работать через хибернейт, при обновлении данных - голый SQL.
PM MAIL ICQ   Вверх
necromancer
Дата 17.2.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



вставлю и свои пять копеек =)
при использовании связей удаление через скл не оправдано. Хотя есть ньюанс. Предположим у нас огромное число записей и необходимо произвести обновление одного поля по опереденному параметру. Если под этот параметр попадает не много записей (относительно бд) то хибернейт справится нормально, а если их много? то вы представляете вытащить миллион записей и заапдейтить их обратно? хотя это можно сделать 1 скл запросом?. 
далее на момент работы хибернаты, необходимо поддерживать транзакционность. т.е. пока вы будете вытаскивать эти много записей, остальные клиенты должны курить в сторонке?

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

Личто мое мнение: ОРМ хорош когда нужно встаивть запись, иногда в простейших случаях получить обратно. удалить эту же запись.Чуть что более сложное не гнушайтесь использовать скл. 
Есть возражение что хибер не зависит от базы а скл зависит - брехня. Возьмите blob в Oracle и MySQL и как говорится почувствуйте разницу.

Добавлено через 2 минуты и 27 секунд
Цитата(pompei @  15.2.2008,  11:55 Найти цитируемый пост)
А напрямую удалять запись объекта через SQL-команды не корректно: может нарушиться ссылочная целостность. 

Все правильно - пусть этим занимается как минимум база данных. А хибернат пусть ей в этом помогает.
Аминь.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.