Crear campo con nombre de palabra reservada con JPA

@Column(name="open") 

Usando el dialecto sqlserver con hibernación.

 [SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid)) [SchemaUpdate] Incorrect syntax near the keyword 'open'. 

Hubiera esperado que hibernate utilizara el identificador entre comillas cuando creara la tabla.

¿Alguna idea sobre cómo manejar esto … que no sea cambiar el nombre del campo?

Tenía el mismo problema, pero con un nombre de tabla llamado Transaction . Si configura

 hibernate.globally_quoted_identifiers=true 

Entonces todos los identificadores de bases de datos serán citados.

Encontré mi respuesta aquí Personaje especial en el nombre de la tabla hibernate dando error

Y encontró todas las configuraciones disponibles aquí https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Sin embargo, no pude encontrar mejores documentos para esto.

Con Hibernate como proveedor de JPA 1.0, puede escapar de una palabra clave reservada encerrándola en los marcadores:

 @Column(name="`open`") 

Esta es la syntax heredada de Hiberate Core:

5.4. Identificadores citados en SQL

Puede forzar a Hibernate a citar un identificador en el SQL generado al encerrar el nombre de la tabla o columna en los trazos en el documento de mapeo. Hibernate usará el estilo de cita correcto para el Dialecto SQL. Por lo general, se trata de comillas dobles, pero el servidor SQL usa corchetes y MySQL usa los palos.

    ...  

En JPA 2.0, la syntax está estandarizada y se convierte en:

 @Column(name="\"open\"") 

Referencias

  • Guía de referencia de Hibernate
    • 5.4. Identificadores citados en SQL
  • Especificación JPA 2.0
    • 2.13 Denominación de objetos de base de datos

Preguntas relacionadas

  • Hibernate, MySQL y la tabla llamada “Repetir” – comportamiento extraño
  • Escaneo automático de palabras reservadas para tablas y columnas de Hibernate

Si usa como se muestra a continuación, debería funcionar

 @Column(name="[order]") private int order; 
 @Column(name="\"open\"") 

Esto funcionará con seguridad. El mismo problema me sucedió cuando estaba aprendiendo a hibernate.

No, cambie el nombre de la columna.

Esto es específico de la base de datos, y simplemente no puede crear dicha columna. Después de todo Hibernate finalmente envía DDL a la base de datos. Si no puede crear un DDL válido con este nombre de columna, esto significa que tampoco puede hibernate. No creo que las citas resuelvan el problema, incluso si está escribiendo el DDL.

Incluso si de alguna manera logras escapar del nombre, cámbialo. Funcionará con esta base de datos, pero no funcionará con otra.

Algunas implementaciones de JPA (por ejemplo, la que uso, DataNucleus) citan automáticamente el identificador por usted, por lo que nunca lo obtiene.