obtenir la prochaine valeur de la séquence à partir de la base de données de l'utilisation d'hibernate

J'ai une entité qui a un champ ID qui doit être défini à partir d'une séquence.
Actuellement, j'ai chercher pour la première valeur de la séquence, de le stocker sur le client, et de calculer à partir de cette valeur.

Cependant, je suis à la recherche d'une "meilleure" manière de faire. J'ai mis en place un moyen pour aller chercher de la prochaine valeur de la séquence:

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

Cependant, cela réduit les performances de manière significative (création d' ~5000 objets est ralenti par un facteur de 3 - de 5740ms à 13648ms ).

J'ai essayé d'ajouter un "faux" entité:

@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
    private long                      id;

    public long getId() {
        return id;
    }
}

Toutefois, cette approche ne fonctionne pas non plus (tous les Id ont été retournés 0).

Quelqu'un peut me conseiller comment faire pour récupérer la séquence suivante de la valeur de l'utilisation d'Hibernate efficacement?

Edit: Après enquête, j'ai découvert que l'appelant Query query = session.createSQLQuery( "select nextval('mySequence')" ); est de loin la plus inefficace que l'utilisation de la @GeneratedValue- en raison de Hibernate en quelque sorte parvient à réduire le nombre d'extractions lors de l'accès à la séquence décrite par @GeneratedValue.

Par exemple, lors de la création de 70 000 entités, (donc avec 70 000 clés primaires récupérée à partir de la même séquence), j'ai tout ce dont j'ai besoin.

CEPENDANT , Hibernate seulement les questions 1404 select nextval ('local_key_sequence') commandes. NOTE: Sur la base de données côté, la mise en cache est mis à 1.

Si j'essaie de récupérer toutes les données manuellement, il va me prendre de 70 000 sélectionne, donc une énorme différence dans la performance. Personne ne sait le fonctionnement interne de mise en veille prolongée, et comment le reproduire manuellement?

InformationsquelleAutor iliaden | 2011-06-17