2010-08-29 28 views
9

Tengo la siguiente definición para un campo de id. En una entidad que está asignada a una tabla en HSQLDB.Hibernate @generatedvalue para HSQLDB

... 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID") 
private Integer id; 
... 

Pero esto no parece generar una identificación única; en su lugar, se intenta insertar un nulo en la columna que da como resultado un error. Si, de forma manual, creo una secuencia y una estrategia de generación para usar esa secuencia, los datos se conservan como se esperaba.

No una estrategia de generación de auto implica que el proveedor (hibernate en este caso) elegirá automáticamente el enfoque correcto y hará todo el trabajo pesado según sea necesario (crear secuencia, usar un enfoque nativo o lo que funcione para ese particular plataforma)? ¿Es mi entendimiento incorrecto?

Respuesta

11

¿No una estrategia de generación de automóviles implica que el proveedor (hibernación en este caso) se elige automáticamente el enfoque correcto y hacer todo el trabajo pesado, según sea necesario (secuencia de crear, utilizar un enfoque nativo o lo que funcione para esa plataforma en particular)? ¿Es mi entendimiento incorrecto?

Lo hace en teoría (por defecto es IDENTIDAD con HSQLDB) y funciona para mí. Esto plantea las siguientes preguntas:

  • ¿Qué dialecto estás usando (por si acaso)?
  • ¿Cómo se creó la tabla?
  • ¿Puedes mostrar el DDL (activar el registro de org.hibernate.tool.hbm2ddl si es necesario)?
  • ¿Cómo se inserta (a través de la API de Hibernate, ¿verdad?)?

Aquí está una muestra de DDL para una entidad Foo cuando se utiliza HSQLDB:

create table Foo (
    id bigint generated by default as identity (start with 1), 
    bar varchar(100), 
    primary key (id) 
) 

que creó la tabla utilizando el gestor de HSQL DB. Solo es normal crear una dirección de tabla ... No había configurado la columna de identificación como identidad en mi caso, simplemente configúrela como clave principal.

Luego de que tenga su respuesta, utilice una columna IDENTITY.

Mientras Hibernate hace elegir la estrategia correcta y no genera las declaraciones INSERT apropiados (que pasan en el null Identificación del que se espera que sean persistido en una columna IDENTITY), no va a crear o alteraciones en el modelo físico si no' t utilizar las capacidades de generación y exportación de DDL.

+0

* El dialecto se ha configurado en org.hibernate.dialect.HSQLDialect * Creé la tabla con el administrador de base de datos HSQL. Solo es normal crear una dirección de tabla ... * Creé la tabla manualmente y no a través de Hibernate * Sí, a través de la persistencia de entitymanager. No había establecido la columna de identificación como identidad en mi caso, simplemente configúrelo como clave principal. – calvinkrishy

+0

Para algunos, el comando DDL que se genera en mi caso es: Empleados de CREATE TABLE (id BIGINT NOT NULL, nombre VARCHAR (50) NOT NULL, CONSTRAINT PK_EMPLOYEES PRIMARY KEY (id)); No se usa identidad en absoluto. – Alexandr

1

Tuve el mismo problema al utilizar una clase de utilidad JpaSchemaGenerator que escribí.

Al generar el esquema de una org.hibernate.dialect.HSQLDialect (donde utilizar una secuencia para generar mis identificadores únicos), utilizo el siguiente Hibernate propiedad:

hibernate.id.new_generator_mappings=true

Esto resulta en la CREATE declaración siguiente:

CREATE TABLE BATCH (
    BAT_ID NUMBER(19,0) NOT NULL, 
    BAT_EXPIRY_DATE TIMESTAMP, 
    BAT_NUMBER VARCHAR2(255 CHAR), 
    BAT_MAT_ID NUMBER(19,0), 
    PRIMARY KEY (BAT_ID) 
); 

Pero cuando utilizo esta misma propiedad en mi clase de utilidad para generar un esquema usando el org.hibernate.dialect.HSQLDialect, obtengo el siguiente CREATE declaración:

CREATE TABLE BATCH (
    BAT_ID BIGINT NOT NULL, 
    BAT_EXPIRY_DATE TIMESTAMP, 
    BAT_NUMBER VARCHAR(255), 
    BAT_MAT_ID BIGINT, 
    PRIMARY KEY (BAT_ID) 
); 

Esto significaría que si he creado un lote sin una identificación, por lo que faltaría para mí y para la restricción NOT NULL causaría una excepción.

Si cambio de la propiedad de hibernación a lo siguiente:

hibernate.id.new_generator_mappings=false

entonces sería generar el CREATE declaración siguiente:

CREATE TABLE BATCH (
    BAT_ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1), 
    BAT_EXPIRY_DATE TIMESTAMP, 
    BAT_NUMBER VARCHAR(255), 
    BAT_MAT_ID BIGINT, 
    PRIMARY KEY (BAT_ID) 
); 

que funciona perfectamente cuando la creación de entidades JPA con Hibernate.

+0

¡Tu consejo funciona para mí, gracias! Tuve este problema cuando actualicé Hibernate y Hsqldb al mismo tiempo (a 5.0.10.Final y 2.4.0, respectivamente). – Dherik

Cuestiones relacionadas