Cómo asignar un campo de entidad cuyo nombre es una palabra reservada en 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'.
Habría esperado que Hibernate usara un identificador entre comillas al crear la tabla.
¿Alguna idea sobre cómo manejar esto... además de cambiar el nombre del campo?
Con Hibernate como proveedor de JPA 1.0, puede escapar de una palabra clave reservada encerrándola entre comillas invertidas:
@Column(name="`open`")
Esta es la sintaxis heredada de Hibernate Core:
5.4. Identificadores entre comillas SQL
Puede forzar a Hibernate a citar un identificador en el SQL generado encerrando el nombre de la tabla o columna entre comillas invertidas en el documento de mapeo. Hibernate utilizará el estilo de cita correcto para el dialecto SQL. Suelen ser comillas dobles, pero SQL Server usa corchetes y MySQL usa comillas invertidas.
<class name="LineItem" table="`Line Item`"> <id name="id" column="`Item Id`"/><generator class="assigned"/></id> <property name="itemNumber" column="`Item #`"/> ... </class>
En JPA 2.0, la sintaxis está estandarizada y pasa a ser:
@Column(name="\"open\"")
Referencias
- Guía de referencia de hibernación
- 5.4. Identificadores entre comillas SQL
- Especificación JPA 2.0
- 2.13 Denominación de objetos de base de datos
Preguntas relacionadas
- Hibernate, MySQL y tabla llamada "Repetir" - comportamiento extraño
- Escape automático de palabras reservadas para tablas y columnas de Hibernate
Tuve el mismo problema, pero con un nombre de tabla llamado Transaction
. si estableces
hibernate.globally_quoted_identifiers=true
Luego se citarán todos los identificadores de la base de datos.
Encontré mi respuesta aquí Carácter especial en el nombre de la tabla hibernar 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 se pudieron encontrar mejores documentos para esto.
En mi caso, la configuración estaba en mi archivo de propiedades de Spring. Como se mencionó en los comentarios, también podría estar en otros archivos de configuración relacionados con la hibernación.
Escapar manualmente de las palabras clave reservadas
Si estás usando JPA, puedes escapar con comillas dobles:
@Column(name = "\"open\"")
Si está utilizando la API nativa de Hibernate, puede escapar de ellas usando comillas invertidas:
@Column(name = "`open`")
Escapar automáticamente de palabras clave reservadas
Si desea escapar automáticamente de las palabras clave reservadas, puede establecer la propiedad de configuración true
específica de Hibernate :hibernate.globally_quoted_identifiers
<property
name="hibernate.globally_quoted_identifiers"
value="true"
/>
formato yaml
spring:
jpa:
properties:
hibernate:
globally_quoted_identifiers: true
Si lo usa como se muestra a continuación, debería funcionar.
@Column(name="[order]")
private int order;