在 Spring Boot 上使用正确的方言 PostgreSQL

pup*_*eno 2 java postgresql spring hibernate

我有一个名为的实体User,它通向一个名为的表,该表user在 PostgreSQL 中应该用引号括起来才能工作。我知道我可以指定一个自定义表名,但是 Hibernate 不应该自动做引号吗?

有人告诉我,也许 Hibernate 没有使用 PostgreSQL 方言。当我的数据库配置如下时,这可能吗:

spring.datasource.url = jdbc:postgresql://localhost/database_name
spring.datasource.username = username
spring.datasource.password = password
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,我如何让 Hibernate 使用正确的方言?

我试过:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
Run Code Online (Sandbox Code Playgroud)

spring.jpa.database=postgresql
Run Code Online (Sandbox Code Playgroud)

spring.jpa.database-platform = org.hibernate.dialect.PostgreSQL94Dialect
Run Code Online (Sandbox Code Playgroud)

spring.jpa.database=org.hibernate.dialect.PostgreSQLDialect
Run Code Online (Sandbox Code Playgroud)

对错误没有影响:

Hibernate: insert into user (created_at, last_modified_at, account_id, email, hashed_password_salt, name, over_hashed_password, preferred_name, public_key, started_displaying_sites_at, watched_tutorial_at, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2017-09-08 14:41:40.177  WARN 15764 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42601
2017-09-08 14:41:40.177 ERROR 15764 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: syntax error at or near "user"
  Position: 13
Run Code Online (Sandbox Code Playgroud)

Alb*_*Bos 8

问题不在于方言,而在于使用 PostgreSQL 保留字的查询user。您可以通过添加引号

@Entity(name = "`user`")
Run Code Online (Sandbox Code Playgroud)

或者重命名该user表。


Mar*_*eel 5

您可以hibernate.auto_quote_keyword使用 value指定配置属性true以启用关键字的自动引用(假设这些在方言和/或 JDBC 数据库元数据中正确定义)。

另请参阅映射属性

hibernate.auto_quote_keyword
truefalse(默认值)
指定是否自动引用任何被视为关键字的名称。

对于 Spring Boot,您可以将其设置为spring.jpa.properties.hibernate.auto_quote_keyword=true(感谢Nikita Bosik

  • 对于 Spring Boot:`spring.jpa.properties.hibernate.auto_quote_keyword=true` (3认同)