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 persist
ing, 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);
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
Vous devez vous connecter pour publier un commentaire.
Essayer l'annotation
@org.hibernate.annotations.GenericGenerator(name = “test-hilo-strategy”, strategy = “hilo”)
:Comme quelqu'un l'a noté ci-dessus,
AUTO
ne fait pas ce que vous en pensez. Il utilise le sous-jacent DB pour déterminer la façon de générer des valeurs. Il peut capter des séquences (par oracle), colonne d'identité (pour mssql), ou quelque chose d'autre qui est db spécifiques.L'approche ici utilise une stratégie interne que Hibernate fournitures appelé "hilo".
Voir le chapitre 5 de la veille prolongée manuel de référence traitant de "Générateur" pour une description complète de ce que chacun de ceux qui sont fournis.
Dans Postgres 8.4.20 j'obtiens le même bug que l'OP à l'aide de
@GeneratedValue(strategy = GenerationType.AUTO)
, mais cette solution n'est pas de le fixer. D'autres idées?OriginalL'auteur Matt
Ni l'OP solution, ni Matt solution travaillé avec mon PostgreSQL 9.3.
Mais celui-ci fonctionne:
Remplacer
mytable_id_seq
avec le nom de la séquence qui génère de votre id.OriginalL'auteur bluish
Utiliser Hibernate méthode:- enregistrer(String entityName, Objet)
Persister le transitoires exemple, l'affectation d'un identifiant généré.
Ne pas utiliser :- @GeneratedValue(stratégie=GenerationType.D'IDENTITÉ) pour la clé primaire si vous voulez persister à l'utilisateur de définir l'Id de.
Pour plus de détails:-
http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#save(java.lang.Chaîne
OriginalL'auteur Vinit Bhardwaj
Dans mycase j'ai été en utilisant Identité stratégie de génération et j'ai mis le mauvais type de données dans Postgresql. Étapes suivantes, j'ai joué à déboguer le problème.
ensemble
spring.jpa.show-sql=true
dans l'application.propriétés et Déposer les tables.Par cette hibernate va automatiquement créer le schéma pour vous sur la base de votre type de données.J'ai remarqué le changement dans le type de données de champ id.
Maintenant, quand j'ai essayé toutes les requêtes post, tout a bien fonctionné.
OriginalL'auteur Shivendra Gupta