2010-08-08 4 views
17

Mes tables PostgreSQL ont des identifiants de type bigserial, ce qui signifie qu'elles sont générées au moment où les lignes sont insérées (et donc, la valeur de la colonne id n'est pas fournie dans l'instruction INSERT). J'ai de la difficulté à trouver la valeur correcte pour l'attribut <generator class="..."> dans mon fichier de mappage XML.Générateur d'id Hibernate approprié pour la colonne serial/bigserial postgres?

Le code ci-dessous est le plus proche que je trouve qui semble être le plus proche de Postgres, mais il effectue toujours un SELECT nextval(...) sur la séquence avant l'insertion (et en incluant 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> 

Répondre

19

Ceci est en situation irrégulière, mais vous pouvez réellement utiliser un générateur identity 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 le fond à ce sujet.

+0

Pour les nouvelles versions (JPA): http://stackoverflow.com/questions/4979746/mapping-postgresql-serial-type-with-hibernate-annotations –

1

Essayé suivant 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> 
4

D'après ce que je lis:

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

devrait fonctionner plus vite que:

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

Le générateur de séquence tombe dans les générateurs de poid non-insertion décrit comme ceci:

Les générateurs POID sans insertion 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 dans la base de données, permettant à NHibernate de différer l'écriture jusqu'à ce que la transaction commerciale soit terminée, réduisant ainsi les allers-retours à la base de données.

Bien que le générateur d'identité est post-insertion des générateurs de poid groupe:

générateurs de poid Post-insert nécessitent des données à être conservées à 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éconseillée! Ils doivent uniquement être utilisés avec des bases de données existantes où d'autres applications s'appuient sur ce comportement.

Les citations ont été tirées du livre de recettes NHibernate 3.0.

+0

Il semble que vos deux blocs de code que vous comparez soient identique, ai-je oublié quelque chose? –

+1

@Matt Huggins: j'ai mal collé: D a changé maintenant –

Questions connexes