У меня есть объект, у которого есть поле 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
.
Например, когда я создаю 70 000 объектов (то есть с 70 000 первичных ключей, полученных из одной и той же последовательности), я получаю все, что мне нужно.
ОДНАКО , Hibernate выдает только 1404 select nextval ('local_key_sequence')
команд. ПРИМЕЧАНИЕ. На стороне базы данных для кеширования установлено значение 1.
Если я попытаюсь получить все данные вручную, мне потребуется 70 000 выборок, что приведет к огромной разнице в производительности. Кто-нибудь знает о внутреннем функционировании Hibernate и о том, как воспроизвести его вручную?