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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate 3 генераторы id, Вопрос по генераторам hibernate 
:(
    Опции темы
MerlinDeep
Дата 18.12.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Очень нужна помощь по генераторам hebernate.

Ситуация: существует БД на firebird с которой работает клиент писаный на delphi, для генерации значений используются три типа генераторов: 
1. максимальный в таблице + 1 (для справочников)
2. генератор на основе sequence  - т.е. есть не системная таблица в которой хранятся последние значения ключевых полей, в таблице три поля - имя таблицы для которой происходит генерация, имя поля первичного ключа, последнее значение
3. генераторы с испольованием тригера перед вставкой

Сейчас для этой БД пишется клиент на java + hibernate + spring + extjs. Менять логику работы БД нельзя, так как клиент для win 32 должен оставаться рабочим.

Подскажите пожалуйста как решить ситуации с генерацией ключей 2. и 3. и если можно с примером smile

Заранее благодарен за любую информацию и помощь.
PM   Вверх
MerlinDeep
Дата 18.12.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Удалось разобраться с генератором варианта 3:

оказалось достаточно следующего кода (обезличен):
Код

@Id
    //Генератор через БД
    @GenericGenerator(name = "myGenerator", strategy = "sequence", parameters = {
        @Parameter(name = "sequence", value = "GEN_DB_IDFIELD")
    })
    @GeneratedValue(generator = "generator")
    @Column(name = "IDFIELD", nullable = false)
    private Integer idfield;

где GEN_DB_IDFIELD - имя генератора в БД

Разбираюсь с вариантом 2 .......
PM   Вверх
MisterCleric
Дата 18.12.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Привет. 
По пункту 2. 
Тебе перед инсертом нужно из этой таблицы руками делать выборку и поулченное значение проставлять в поле первичного ключа у сущности.
По пункту 3. 
Так использовать в Hibernate нельзя, поскольку перзистенс контекст ничего не будет знать о значениях, которые проставляются на уровне БД, после того как он закончил свою работу(INSERT, UPDATE, DELETE)
Надо придумать какой-то механизм выполнения операции вставки, чтобы все были довольны.
А можно ли переделать этот триггер? Чтобы он перед генерацией делал проверку, что поле для генерации IS NULL? Тогда ты на таких таблица сможешь из hibernate использовать люобой способ из первых двух. А Win32 клиент будет продолжать работать в том же духе.
Ну в общем, подумайте что и где можно все-таки подвинуть в БД, иначе придеться отказываться от Hibernate 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MerlinDeep
Дата 18.12.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MisterCleric, спасибо что откликнулись.

Использование второго варианта естественно предпологает проверку на NULL в тригере
Так было изначально в базе и менять ничего не пришлось smile
Как Вы думаете: других проблем не должно быть при таком пользовании генерации?

Добавлено через 2 минуты и 13 секунд
Цитата(MisterCleric @ 18.12.2010,  12:50)
По пункту 2. 
Тебе перед инсертом нужно из этой таблицы руками делать выборку и поулченное значение проставлять в поле первичного ключа у сущности.

хотелось бы получить что-то универсальное, сейчас пытаюсь родить самописный генератор, к сожалению мало примеров в нете :(
PM   Вверх
MisterCleric
Дата 18.12.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Цитата

Как Вы думаете: других проблем не должно быть при таком пользовании генерации?

Главное чтобы генерируемое значение бралось из одного места: что триггером, что руками

Это сообщение отредактировал(а) MisterCleric - 18.12.2010, 13:12


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MerlinDeep
Дата 18.12.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(MisterCleric @ 18.12.2010,  13:11)
Главное чтобы генерируемое значение бралось из одного места: что триггером, что руками

так и есть, получается что для этого случая берется из генераторов firebird
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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