Hibernate null violation de contrainte sur @Id @GeneratedValue

Je suis de l'utilisation d'Hibernate 4.1.3 (JPA) sur le Jeu! cadre. La base de données PostgreSQL 8.4.2. Le schéma a été généré à l'aide de hibernate.hbm2ddl.auto="update".

Version courte: j'ai une classe qui a un @Id champ qui est un @GeneratedValue. Parfois, quand persisting, je reçois un null-colonne de violation, pourquoi?


Plus de détails:

J'ai une classe simple, que je veux l'enregistrer dans la base de données, qui ressemble à ceci:

@Entity
class MyObject {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    @NotNull
    public String email;

    public Integer total;
}

J'ai l'habitude de créer une instance de MyObject, je assigner une valeur à email et total champs, tandis que id est nulle et que je sauvegarde via EntityManager.persist(). Hibernate obtient un id pour le nouvel objet et l'enregistre dans la DB.

Mais parfois, j'ai le stacktrace:

2012-05-19 00:45:16,335 - [ERROR] - from org.hibernate.engine.jdbc.spi.SqlExceptionHelper [SqlExceptionHelper.java:144] in play-akka.actor.actions-dispatcher-6 
ERROR: null value in column "id" violates not-null constraint

2012-05-19 00:45:16,350 - [ERROR] - from application in play-akka.actor.actions-dispatcher-6 


! @6ad7j3p8p - Internal server error, for request [POST /method] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[PersistenceException: org.hibernate.exception.ConstraintViolationException: ERROR: null value in column "id" violates not-null constraint]]

Comment est-ce possible? Comment puis-je suivre le problème?

Voici pertinentes DDL générées par Hibernate:

CREATE TABLE myobject (
    id bigint NOT NULL,
    email character varying(255) NOT NULL,
    physical integer
);

CREATE SEQUENCE hibernate_sequence
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;


ALTER TABLE ONLY dailydetailedscore
    ADD CONSTRAINT dailydetailedscore_pkey PRIMARY KEY (id);
Ajouter le DDL générées par Hibernate pour votre base de données. GenerationType.AUTO signifie que vous avez choisi d'Hibernate sélectionnez un type de génération pour vous, ce qui n'est probablement pas ce que vous comptiez faire.
fait, merci pour le tuyau.
Le schéma a l'air bien. Cela peut être un problème d'interaction entre le Jeu! et JPA. Avez-vous essayé d'utiliser une colonne d'identité à la place?
signifie que vous avez choisi d'Hibernate sélectionnez un type de génération", Mais il doit choisir un bon. Dit-JPA standard [emphase ajoutée]: "le fournisseur de persistance doit chercher une approprié stratégie de base de données particulière." Une stratégie qui viole une contrainte not NULL ne pourrait jamais être "approprié". N'est-ce que cela indique un défaut dans Hibernate?
Je reçois un problème similaire avec Spring+Hibernate+Derby.

OriginalL'auteur Giuseppe Cardone | 2012-05-19