У меня есть объект, который имеет поле NON-ID, которое должно быть установлено из последовательности.В настоящее время я выбираю первое значение последовательности, сохраняю его на стороне клиента и вычисляю из этого значения.
Однако я ищу «лучший» способ сделать это.Я реализовал способ получения следующего значения последовательности:
public Long getNextKey()
{
Query query = session.createSQLQuery( "select nextval('mySequence')" );
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Однако этот способ значительно снижает производительность (создание ~ 5000 объектов замедляется в 3 раза - с 5740 до 13648 мс).
Я попытался добавить «поддельную» сущность:
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
Однако этот подход тоже не сработал (все возвращенные идентификаторы были 0).
Можеткто-то посоветует мне, как эффективно извлечь следующее значение последовательности, используя Hibernate?
Редактировать: После исследования я обнаружил, что вызов Query query = session.createSQLQuery( "select nextval('mySequence')" );
гораздо более неэффективен, чем использование @GeneratedValue
- из-за Hibernate каким-то образом удается уменьшить количество выборок при доступе к последовательности, описанной @GeneratedValue
.
Например, когда я создаю 70000 сущностей (то есть с 70000 первичных ключей, выбранных из той же последовательности), я получаю все, что мне нужно.
HOWEVER , только Hibernateвыдает 1404 select nextval ('local_key_sequence')
команд.ПРИМЕЧАНИЕ. На стороне базы данных значение кэширования равно 1.
. Если я попытаюсь извлечь все данные вручную, мне потребуется 70 000 операций выбора, таким образом огромная разница в производительности.Кто-нибудь знает внутреннее функционирование Hibernate и как его воспроизвести вручную?