Spring 引导应用程序不会为 JPA @Table注释创建模式



我希望表位于不同的数据库模式中。但不幸的是,我无法使用Spring Boot实现这一目标。这是重现它的步骤。

  1. 在 2.0.5 版本上创建一个新的 Spring Boot 项目 http://start.spring.io(带有 derby 和 PostgreSQL 依赖项(

  2. 创建简单实体

@Entity
@Table(name = "my_table")
public class MyTable {
@Id Integer id;
}
  1. 仅将下一个属性添加到应用程序.值为"update"或"create"的属性(如果尝试"create-drop",则会收到此处描述的另一个错误:https://github.com/spring-projects/spring-boot/issues/7706#issuecomment-268798059(。现在默认使用德比数据源。

spring.jpa.hibernate.ddl-auto=create

  1. 运行生成的测试或主类。 确保一切正常。

  2. 修改实体,将属性schema添加到@Table注释中。现在,实体如下所示:

@Entity
@Table(name = "my_table", schema = "my_schema")
public class MyTable {
@Id Integer id;
}
  1. 运行测试(或主类(。这次我在 Spring 启动初始化过程"java.sql.SQLSyntaxErrorException: Schema 'MY_SCHEMA' does not exist"时收到错误:

完整的日志列表可在此处获得:https://gist.github.com/asaushkin/8d767c92b2e7025dd359f7be43eefdd6

  1. 检查PostgreSQL。此错误也会在PostgreSQL实例上重现。如果没有"schema"属性,Spring Boot 应用程序可以完美运行,但是一旦此属性出现在@Table注释中,就会抛出异常。

完整日志在这里: https://gist.github.com/asaushkin/dd0d677964556bf943c4f013d4785372

我的问题是:为什么 Spring Boot 不是创建模式?

这些选项也无法解决此问题:

spring.jpa.properties.javax.persistence.schema-generation.create-database-schemas=true
spring.jpa.properties.hibernate.hbm2dll.create_namespaces=true

链接

  1. https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-hbmddl
  2. https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-configure-jpa-properties

更新(2019年3月11日(:

我刚刚检查了问题的当前行为。我想知道,但目前使用 Derby 驱动程序一切正常,并且表是使用指定的架构创建的。但是在PostgreSQL中,错误仍然存在。

生成的 SQL(用于 PostgreSQL(是:

create table my_schema.my_table (id int4 not null, primary key (id))

spring.jpa.properties.javax.persistence.schema-generation.create-database-schemas重命名为spring.jpa.properties.javax.persistence.create-database-schemas。换句话说,删除".schema-generation"。

我只是遇到了同样的问题,不是 PostgreSQL,而是 H2 - 没有创建模式。但是,正如我所发现的,问题不在于H2(或者,很可能是PostgreSQL(,而在于Hibernate(它偏离了标准,关于该命名法(。这可能意味着此解决方案也适用于您。

检查您是否在 application.properties 文件中指定了数据库方言,以获取更多检查此线程。

无法让 Spring 引导自动创建数据库模式

我在PostgreSQL和JPA上遇到了同样的问题(错误o.h.e.jdbc.spi.SqlExceptionHelper - 错误:关系"schema.table"不存在(,我想出了这个解决方案。

在实体类中,在数据库元素的名称之间添加转义字符 \"。例如:

使用此表单:

@Table(name = ""USUARIO"", schema=""INVENTARIODB"")

而不是典型的方式

@Table(name = "USUARIO", schema="INVENTARIODB")

这同样适用于列名

@Column(name = ""ID"", nullable = false, updatable = false)    
private Long id;

而不是

@Column(name = "ID", nullable = false, updatable = false)    
private Long id;

更新:

我发现了导致问题的原因。我使用Valentina Studio来创建我的数据库,如果我使用大写字母(MYTABLE(,而不是小写字母(mytable(来创建我的表,我必须在SQL语句中使用双引号。这是因为PostgreSQL区分大小写。如果您无法更改数据库,请使用我上一个解决方案。启用 spring.jpa.show-sql=true 属性也是一个好主意,这样您就可以看到 hibernate 的查询并知道发生了什么。

最新更新