Question

Mes tables postgresql ont des identifiants de type bigserial, ce qui signifie qu'ils sont générés au moment où les lignes sont insérées (et donc, la valeur de la colonne ID n'est pas fournie dans le INSERT déclaration). J'ai du mal à trouver la valeur appropriée pour le <generator class="..."> Attribut dans mon fichier de mappage XML.

Le code ci-dessous est le plus proche que j'ai trouvé qui semble être le plus proche de Postgres, mais il exécute toujours un SELECT nextval(...) sur la séquence avant l'insertion (et y compris explicitement la valeur du champ ID sur l'insert). Je veux juste que HiberNate n'inclue pas du tout la valeur du champ ID, permettant à Postgres de faire son travail de génération de la valeur elle-même.

    <id name="id" column="id" type="java.lang.Long">
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
    </id>
Était-ce utile?

La solution

Ceci est sans papiers mais vous pouvez réellement utiliser un identity Générateur avec PostgreSQL lorsque le PK est de type SERIAL ou BIGSERIAL:

<id name="id" column="user_id" type="java.lang.Long">
     <generator class="identity"/>
</id>

Voir HB-875 et HHH-1675 pour un arrière-plan à ce sujet.

Autres conseils

D'après ce que j'ai lu:

<id name="id" column="id" type="java.lang.Long">
    <generator class="sequence">
        <param name="sequence">my_sequence_name</param>
    </generator>
</id>

devrait fonctionner plus rapidement que:

<id name="id" column="id" type="java.lang.Long">
    <generator class="identity" />
</id>

Le générateur de séquences tombe dans le Générateurs POID non insertés décrit comme ceci:

Les générateurs POID non insertifs sont la meilleure option pour les nouvelles applications. Ces générateurs permettent à Nhibernate d'attribuer une identité à un objet persistant sans écrire les données de l'objet à l'atabase, permettant à Nhibernate de retarder l'écriture jusqu'à ce que la transaction commerciale soit terminée, réduisant les aller-retour dans la base de données.

Alors que le générateur d'identité est Générateurs POID post-insert groupe:

Les générateurs de POID post-insert nécessitent que les données soient persistées dans la base de données pour un ID à générer. Cela modifie le comportement de Nhibernate de manière très subtile et désactive certaines fonctionnalités de performance. En tant que tel, l'utilisation de ces générateurs POID est fortement découragée! Ils ne doivent être utilisés qu'avec des bases de données existantes où d'autres applications reposent sur ce comportement.

Des citations ont été tirées du livre de cuisine Nhibernate 3.0.

Essayé de suivre et cela a fonctionné:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top