У меня есть объект, у которого есть поле 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 и как его воспроизвести вручную?