Приложение Spring Boot не создает схемы для аннотации JPA @Table - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу, чтобы таблицы располагались в разных схемах базы данных. Но, к сожалению, я не могу добиться этого с помощью Spring Boot. Вот шаги, чтобы воспроизвести это.

  1. Создание нового проекта Spring Boot на http://start.spring.io версии 2.0.5 (с зависимостями derby и PostgreSQL)

  2. Создать простую сущность

@Entity
@Table(name = "my_table")
public class MyTable {
    @Id Integer id;
}
  1. Добавить только следующее свойство в application.properties со значением 'update' или 'create' (если вы попробуете '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. Без атрибута «схема» приложение 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

Обновление (11 марта 2019 года):

Я только что проверил текущее поведение проблемы. Интересно, но в настоящее время с драйвером Derby все работает нормально и таблица создается с указанной схемой. Но в PostgreSQL ошибка продолжает существовать.

Сгенерированный SQL (для PostgreSQL):

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

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

У меня была такая же проблема с PostgreSQL и JPA (ОШИБКА o.h.e.jdbc.spi.SqlExceptionHelper - ОШИБКА: отношения "schema.table" не существует), и я нашел это решение.

В ваших классах сущностей добавьте escape-символы \ "между именами элементов базы данных. Например:

Используйте эту форму:

@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;

UPDATE:

Я обнаружил причину, вызвавшую проблему. Я использовал Valentina Studio для создания своей БД. Если для создания таблиц я использовал заглавные буквы (MYTABLE), а не строчные буквы (mytable), мне приходилось использовать двойные кавычки внутри операторов SQL. Это потому, что PostgreSQL чувствителен к регистру. Если вы не можете изменить свою базу данных, воспользуйтесь моим последним решением. Также рекомендуется включить свойство spring.jpa.show-sql = true, чтобы вы могли видеть запросы hibernate и знать, что происходит.

0 голосов
/ 12 сентября 2018

Убедитесь, что вы указываете диалект базы данных в файле application.properties или нет, проверьте этот поток.

Невозможно получить загрузочную пружину для автоматического создания схемы базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...