get próximo valor da sequência do banco de dados usando hibernate
Tenho uma entidade que possui um campo NON-ID que deve ser definido a partir de uma sequência. Atualmente, busco o primeiro valor da sequência, armazeno-o no lado do cliente e calculo a partir desse valo
No entanto, estou procurando uma maneira "melhor" de fazer isso. Eu implementei uma maneira de buscar o próximo valor de sequência:
public Long getNextKey()
{
Query query = session.createSQLQuery( "select nextval('mySequence')" );
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Entretanto, dessa maneira, reduz-se significativamente o desempenho (a criação de ~ 5.000 objetos fica mais lenta por um fator de 3 - de 5740ms para 13648ms
Tentei adicionar uma entidade "falsa":
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
De qualquer forma essa abordagem também não funcionou (todos os IDs retornados foram 0
Pode alguém me aconselhar como buscar o próximo valor de sequência usando o Hibernate com eficiênci
Editar Após investigação, descobri que ligar paraQuery query = session.createSQLQuery( "select nextval('mySequence')" );
é de longe mais ineficiente do que usar o@GeneratedValue
- por causa do Hibernatede alguma form consegue reduzir o número de buscas ao acessar a sequência descrita por@GeneratedValue
.
or exemplo, quando crio 70.000 entidades (portanto, com 70.000 chaves primárias buscadas na mesma sequência), recebo tudo o que precis
CONTUD, O Hibernate apenas emite 1404 select nextval ('local_key_sequence')
comandos. NOTA: No lado do banco de dados, o cache está definido como 1.
Se eu tentar buscar todos os dados manualmente, levarei 70.000 seleções, portanto, uma enorme diferença no desempenho. Alguém conhece o funcionamento interno do Hibernate e como reproduzi-lo manualment