hibernate - example - spring.jpa.database-platform postgres
No se puede utilizar la tabla llamada "usuario" en hibernaciĆ³n postgresql (5)
Como han dicho otros, el user
es una palabra reservada en SQL y Postgres.
Muchas bases de datos tienen muchas palabras reservadas, más de mil la última vez que conté. Por lo tanto, es muy fácil encontrar un problema extraño debido a una colisión de palabras reservada.
user_
subrayado: user_
Este es el consejo más práctico que he aprendido para SQL: siempre agregue un guión bajo a sus nombres. Hago esto para nombres de tablas, nombres de columnas, nombres de índices, etc.
La especificación de SQL específicamente promete † nunca tener una palabra clave o una palabra reservada con un guión bajo. Esta promesa está extrañamente insertada en la especificación sin contexto. Pero a mí grita "¡Agregue un guión bajo a todos sus nombres!".
Después de adoptar esta regla, descubrí un agradable beneficio secundario. Cuando veo el guión bajo en el código, en los comentarios, en el seguimiento de problemas y en los correos electrónicos, siempre sé que nos estamos refiriendo específicamente al elemento de la base de datos, como customer_
table frente al concepto de "cliente" o la clase Customer
en mi código de Java
† No puedo citar la especificación SQL porque está protegida por copyright, desafortunadamente. En la especificación SQL:2011 , lea la sección 5.4 Nombres e identificadores bajo el encabezado Reglas de sintaxis, ítem 3, NOTA 111. En SQL-92 vea la sección 5.2, ítem 11. Sólo buscará la palabra underscore
.
Cuando intento persistir, una entidad llamada "usuario" con JPA / hibernar no funciona. La tabla no se crea y es porque el usuario es una palabra reservada en postgresql. ¿Hay alguna otra forma que no sea nombrar la tabla de alguna otra manera para hacer que esto funcione?
JPA admite la siguiente sintaxis para especificar que el nombre de la tabla debe usarse exactamente como se especifica:
@Table(name="/"user/"")
Intente usar esta anotación en su clase de entidad y vea si hace el truco. Las barras invertidas se utilizan para escapar de un conjunto de comillas dobles, por lo que parece un poco feo.
Para citar un identificador, use marcas anteriores:
@Table(name="`users`")
Vea este ejemplo de la suite de pruebas de Hibernate:
Hibernate lo detectará automáticamente y se convertirá en la cotización adecuada para la base de datos que está utilizando.
PostgreSQL sigue el estándar ANSI para citar nombres de objetos, por lo que debe especificar "usuario" como el nombre de la tabla (incluidas las comillas dobles)
SELECT * FROM "user";
No sé cómo le dirías a Hibernate que genere tal declaración.
Te recomiendo que encuentres un nombre diferente para tu mesa, te dará más problemas que vale la pena.
Yo diría que debería evitar tener nombres de tablas que sean palabras reservadas, con hibernación. Claro que puede escapar, pero puede causar problemas en el futuro (en una consulta, por ejemplo). Así que la forma más segura es nombrar la tabla de otra manera, digamos los users
:
@Entity
@Table(name="users")
public class User {..}