2010-08-09 13 views
1

Я хочу, чтобы Hibernate 3.3.0 генерировал значение, выполнив запрос SELECT до INSERT (persist()). Который будет работать так:Hibernate: Значение, сгенерированное SQL-запросом

@Generated(GenerationTime.INSERT) 
@GenerateSQL("SELECT RANDOM() * 2") 
private int number; 

Я имел взгляд на @Generated(), что хорошо для TRIGGER с. Я не хочу вводить триггер.

Я также посмотрел @Formula, это только для чтения.

Итак, какова правильная комбинация аннотаций? Благодарю.

ответ

1

Я хочу Hibernate 3.3.0, чтобы генерировать значение, выполняя SELECT, INSERT запроса перед

Я не думаю, что это поддерживается.

Альтернатива № 1: Возможно, вы можете выполнить SELECT как часть логики «создать» непосредственно в вашем коде.

Вариант № 2: использовать Hibernate перехватчик, обеспечивает ссылку на SessionFactory и выполнить ВЫБОР во onSave от перехватчика.

Итак, какова правильная комбинация аннотаций?

Установка по умолчанию на самом деле не очень хорошо поддерживается (см HHH-4341) и самым простым решением было бы ИМО определить значение по умолчанию на уровне столбцов. Это было бы моим Альтернатива № 3. Ниже приведен пример:

@Generated(GenerationTime.INSERT) 
@Column(insertable=false, columnDefinition="INT DEFAULT 20") 
private int someNumber; 

Я не знаю, если это вариант для вас, и я не уверен, что при использовании RANDOM() в DEFAULT будет поддерживаться базой данных (как может RANDOM() * 2 стать int К путь?).

+0

Объявление №1 - Ну, я думаю, я закончу этим. Но это требует от меня отмены транзакции на более высокий уровень абстракции. Ad RANDOM() 'vs.' int' - ok, вы получили меня :) Реальный случай использования - это создание номеров счетов, которые не являются просто последовательностью (отменены счета-фактуры и т. Д.) –

+0

@ Ondra Я полагал, что это был пример :), но я вижу. Однако у меня нет лучших предложений. –

Смежные вопросы