Estoy usando Hibernate 4.1.3 (JPA) en el Juego! marco. La base de datos es PostgreSQL 8.4.2. El esquema fue generada usando hibernate.hbm2ddl.auto="update".

Versión corta: tengo una clase que tiene un @Id campo que es una @GeneratedValue. A veces, cuando persisting, me sale un valor null en la columna de la violación, ¿por qué?


Más detalles:

Tengo una muy simple clase que quiero guardar en la base de datos, que se parece a esto:

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

    @NotNull
    public String email;

    public Integer total;
}

Por lo general crear una instancia de MyObject, puedo asignar un valor a email y total campos mientras id es nulo y la guardo a través de EntityManager.persist(). Hibernate obtiene un id para el nuevo objeto y la guarda en la DB.

Sin embargo, a veces, me sale el siguiente 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]]

¿Cómo es esto posible? ¿Cómo puedo resolver el problema?

Aquí está la pertinente DDL generado por 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);
Agregar el DDL generado por Hibernate para la base de datos. GenerationType.AUTO significa que usted han elegido de Hibernación, seleccione un tipo de generación para usted, que es probablemente lo que usted desea hacer.
hecho, gracias por la pista.
El esquema se ve bien. Esto podría ser un problema de la interacción entre el Juego! y JPA. Has probado a utilizar una columna de identidad en su lugar?
significa que usted han elegido de Hibernación, seleccione un tipo de generación», Pero se debe seleccionar una buena. Quoth el estándar JPA [énfasis añadido]: «el proveedor de persistencia debe escoger un de estrategia para la base de datos en particular.» Una estrategia que infringe una restricción not NULL nunca podría ser «apropiadas». ¿Esto indica un defecto en modo de Hibernación?
Tengo un problema similar con Spring+Hibernate+Derby.

OriginalEl autor Giuseppe Cardone | 2012-05-19

Dejar respuesta

Please enter your comment!
Please enter your name here