GeneratedValue dans Postgres
J'ai ma classe d'entité mappé comme ci-dessous:
@Entity
@Audited
@Table(name="messages_locale")
public class Locale {
@Id
@GeneratedValue
@Getter @Setter //Project Lombok's annotations, equal to generated getter and setter method
private int id;
(...)
J'ai créer la nouvelle base de données et propriétés:
< prop key="hibernate.hbm2ddl.auto" >créer < /prop>
POURQUOI L'ENFER (Désolé, presque deux jours de perdu sur ce bug) après avoir créé la base de données, j'ai eu une séquence dans mon postgres db?:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
Je ne veux pas avoir une séquence, je veux juste de l'auto incrémentation automatique des valeurs générées..
OriginalL'auteur Cichy | 2012-10-28
Vous devez vous connecter pour publier un commentaire.
Dans PostgreSQL auto-incrément est gérée à l'aide de la
SERIAL
pseudo type. Vous utilisez ce type lorsque vous exécutezCREATE TABLE
.Maintenant au point - ce
SERIAL
pseudo type crée une séquence.Autoincrement dans
PostgreSQL
est gérée à l'aide de la séquence créée. La valeur par défaut de laid
colonne devient -nextval('your_sequence_name')
.En veille prolongée pour une
User
entité:Lire ici:
http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL
http://www.neilconway.org/docs/sequences/
Chaque
id
colonne de chaque table doit avoir une séquence distincte. Regarde mon edit.OriginalL'auteur Petar Minchev
Je pense que l'on a accepté la réponse de Petar n'est pas correct ou pas correct tout au plus. L'auto-incrémentation dans Postgres est gérée par le biais
SERIAL
pseudo type, c'est correct. Cependant, la cartographie que Petar donne, voici les DDL générées par Hibernate 5.1:Ce n'est pas à l'aide de
SERIAL
, mais Hibernate réussi séquence. Elle n'est pas détenue par la table et pas de valeur par défaut a été définie. Bien sûr, DDL génération est une fonctionnalité que beaucoup de gens ne pas utiliser en production (mais beaucoup de prendre le code généré en tant que modèle).Si vous inscrire à la main de la DDL et effectivement utilisées
SERIAL
, puis à l'aideGenerationType.SEQUENCE
peuvent même entrer en conflit avec la base de données de comportement. La manière correcte de la carte d'Hibernate avec Postgres’ préféré ID stratégie est à l'aide deGenerationType.IDENTITY
. D'ailleurs, le code est également beaucoup plus court et plus lisible:OriginalL'auteur Michael Piefel