obtenga el siguiente valor de secuencia de la base de datos usando hibernate

Tengo una entidad que tiene un campo NO ID que debe establecerse a partir de una secuencia. Actualmente, busco el primer valor de la secuencia, lo almaceno en el lado del cliente y calculo a partir de ese valor.

Sin embargo, estoy buscando una "mejor" forma de hacerlo. He implementado una forma de recuperar el siguiente valor de secuencia:

public Long getNextKey()
{
    Query query = session.createSQLQuery( "select nextval('mySequence')" );
    Long key = ((BigInteger) query.uniqueResult()).longValue();
    return key;
}

in embargo, de esta manera se reduce significativamente el rendimiento (la creación de ~ 5000 objetos se ralentiza en un factor de 3: de 5740 ms a 13648 ms).

He intentado agregar una entidad "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;
    }
}

in embargo, este enfoque tampoco funcionó (todos los ID devueltos fueron 0).

¿Puede alguien aconsejarme cómo obtener el siguiente valor de secuencia usando Hibernate de manera eficiente?

Editar Tras la investigación, descubrí que llamar aQuery query = session.createSQLQuery( "select nextval('mySequence')" ); es mucho más ineficiente que usar@GeneratedValue - debido a Hibernatede alguna maner logra reducir el número de recuperaciones al acceder a la secuencia descrita por@GeneratedValue.

Por ejemplo, cuando creo 70,000 entidades (con 70,000 claves principales obtenidas de la misma secuencia), obtengo todo lo que necesito.

SIN EMBARG, Hibernate solo emite 1404 select nextval ('local_key_sequence') comandos. NOTA: en el lado de la base de datos, el almacenamiento en caché se establece en 1.

Si trato de obtener todos los datos manualmente, me llevará 70,000 selecciones, por lo tanto, una gran diferencia en el rendimiento. ¿Alguien sabe el funcionamiento interno de Hibernate y cómo reproducirlo manualmente?

Respuestas a la pregunta(9)

Su respuesta a la pregunta