Таблица "DBNAME.hibernate_sequence" не существует

У меня есть приложение SpringBoot 2.0.1.RELEASE, использующее данные Spring / jpa

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

Но когда я делаю обновление в базе данных Amazon Aurora, я получаю такую ​​ошибку:

2018-04-13 09:20 [pool-1-thread-1] ERROR o.h.id.enhanced.TableStructure.execute(148) - could not read a hi value com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'elbar.hibernate_sequence' doesn't exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

У меня есть это в объекте, который я хочу сохранить

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

Я также хотел бы избежать каких-либо недостатков в базе данных для получения идентификатора.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
68
0
61 736
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

С поколением GenerationType.AUTO спящий режим будет искать таблицу hibernate_sequence по умолчанию, поэтому измените поколение на IDENTITY, как показано ниже:

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;
vladmihalcea.com/… четко объясняет, что изменилось между основными версиями Hibernate 3 и 5 при обработке GenerationType.AUTO
SudhirR 26.08.2019 09:05

@SudhirR Спасибо отличная статья :)

Spring 26.08.2019 10:50

На всякий случай, если вы перейдете с предыдущей загрузочной версии:

установка следующего параметра в вашем application.yml предотвратит поиск записей hibernate_sequence в спящем режиме.

spring.jpa.hibernate.use-new-id-generator-mappings

Это было по умолчанию в Boot 1.x

Добавьте следующий конфиг в свой application.yml:

spring: jpa: hibernate: use-new-id-generator-mappings: false

Или это, если вы используете application.properties

spring.jpa.hibernate.use-new-id-generator-mappings= false

JPA и автоматический DDL

Когда я сталкиваюсь с несоответствием сопоставления между схемой таблицы и Java-сущностью, мне нравится делать следующее.

  1. Отбросить схему
  2. Добавьте свойство spring.jpa.hibernate.ddl-auto=create в application.properties
  3. Перезагрузите ваше приложение

Теперь будет воссоздана схема на основе вашей сущности. Затем вы можете сравнить созданную таблицу со старой схемой, чтобы увидеть разницу, если это необходимо.

Warning : This will truncate the data in all tables specified as entities in your application

Если вы используете версию Hibernate до Hibernate5, @GeneratedValue(strategy = GenerationType.IDENTITY) работает отлично. Но для публикации Hibernate5 необходимо следующее исправление.

@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator = "native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;

DDL

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY

ПРИЧИНА

Отрывок из спящий режим

Currently, if the hibernate.id.new_generator_mappings is set to false, @GeneratedValue(strategy = GenerationType.AUTO) is mapped to native. If this property is true (which is the defult value in 5.x), the @GeneratedValue(strategy = GenerationType.AUTO) is always mapped to SequenceStyleGenerator.

For this reason, on any database that does not support sequences natively (e.g. MySQL) we are going to use the TABLE generator instead of IDENTITY.

However, TABLE generator, although more portable, uses a separate transaction every time a value is being fetched from the database. In fact, even if the IDENTITY disables JDBC batch updates and the TABLE generator uses the pooled optimizer, the IDENTITY still scales better.

Другие вопросы по теме