Spring Boot应用程序不会为JPA @Table注释创建架构

时间:2018-09-12 13:19:19

标签: java spring hibernate spring-boot jpa

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

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

  2. 创建简单实体

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

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 Boot初始化过程“ 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))

2 个答案:

答案 0 :(得分:0)

检查是否在application.properties文件中指定了数据库方言,有关更多信息,请检查此线程。

Unable to get spring boot to automatically create database schema

答案 1 :(得分:0)

我在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的查询并了解发生了什么。