Spring Boot: таблицы создаются в нижнем регистре

2

Я использую PostgreSQL данных Spring Boot и PostgreSQL. У меня есть класс сущности:

@Entity
@Table(name = "TEST")

public class Test {
@Id
@GeneratedValue
private Long id;
}

И вот мой файл application.properties:

spring.datasource.url = jdbc:postgresql://localhost:5432/postgres
spring.datasource.username = postgres
spring.datasource.password = 1234
spring.jpa.hibernate.ddl-auto= update
spring.jpa.properties.hibernate.dialect = 
org.hibernate.dialect.PostgreSQL94Dialect

Он создает таблицу, но имя таблицы является test (с нижним регистром). Как сделать это прописным?

Вот мой файл pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

РЕДАКТИРОВАТЬ

Кстати, я получаю следующую ошибку при установке проекта с Maven (clean, install):

java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171] at.................................... Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented at org.postgresql.Driver.notImplemented(Driver.java:688) ~[postgresql-42.2.4.jar:42.2.4] at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1269) ~[postgresql-42.2.4.jar:42.2.4]... 70 common frames omitted

Это как-то связано?

  • 0
    @lucumt Принятый ответ на этот вопрос не работает для меня.
  • 0
    stackoverflow.com/questions/21796446/postgres-case-sensitive прочитайте комментарий и приняли ответ
Теги:
spring-boot
spring
jpa

3 ответа

0

Попробуй это:

@Table(name = "\"TEST\"")

В постгресах:

Вычисление идентификатора также делает его чувствительным к регистру, тогда как неупомянутые имена всегда сворачиваются в нижний регистр. Например, идентификаторы FOO, foo и "foo" считаются одинаковыми PostgreSQL, но "Foo" и "FOO" отличаются от этих трех и друг друга. (Смещение неопределенных имен в нижний регистр в PostgreSQL несовместимо со стандартом SQL, в котором говорится, что неупомянутые имена должны быть свернуты в верхний регистр. Таким образом, foo должен быть эквивалентен "FOO", а не "foo" в соответствии со стандартом. вы хотите писать переносные приложения, вам рекомендуется всегда указывать конкретное имя или никогда не процитировать его.)

из документов https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html

  • 1
    Пожалуйста, дополните ваш ответ документацией или объяснением, почему что-то работает / не работает.
0

Вы должны попробовать следующие способы:

1) Добавьте в application application.properties spring.jpa.hibernate.naming.physical так:

spring.datasource.url = jdbc:postgresql://localhost:5432/postgres
spring.datasource.username = postgres
spring.datasource.password = 1234
spring.jpa.hibernate.ddl-auto= update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL94Dialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

2) Или попробуйте изменить org.hibernate.dialect.PostgreSQL94Dialect на org.hibernate.dialect.PostgreSQLDialect

spring.datasource.url = jdbc:postgresql://localhost:5432/postgres
spring.datasource.username = postgres
spring.datasource.password = 1234
spring.jpa.hibernate.ddl-auto= update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

Для получения дополнительной информации вы должны увидеть это или это

  • 1
    Первый подход не сработал. Может быть, у меня есть некоторые несоответствия в моем pom.xml? Можете ли вы проверить это, пожалуйста, я опубликую это сейчас.
  • 1
    Второй подход тоже не сработал. Таблица все еще создается в нижнем регистре.
0

Попробуйте ускользнуть от имени своей сущности с двойными кавычками, например:

@Entity
@Table(name = "\"TEST\"")
public class Test {
   @Id
   @GeneratedValue
   private Long id;
}

Или же

@Entity
@Table(name = "TEST")
public class Test implements Serializable {
   @Id
   @GeneratedValue
   private Long id;
}
  • 0
    Оба подхода не сработали. Кстати, я получаю сообщение об ошибке при установке проекта через Maven (очистить, установить). Проверьте редактирование.
  • 0
    попробуйте добавить spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false в ваш файл application.properties
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню