У меня есть приложение 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;
Я также хотел бы избежать каких-либо недостатков в базе данных для получения идентификатора.




С поколением GenerationType.AUTO спящий режим будет искать таблицу hibernate_sequence по умолчанию, поэтому измените поколение на IDENTITY, как показано ниже:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@SudhirR Спасибо отличная статья :)
На всякий случай, если вы перейдете с предыдущей загрузочной версии:
установка следующего параметра в вашем 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
Когда я сталкиваюсь с несоответствием сопоставления между схемой таблицы и Java-сущностью, мне нравится делать следующее.
spring.jpa.hibernate.ddl-auto=create в application.propertiesТеперь будет воссоздана схема на основе вашей сущности. Затем вы можете сравнить созданную таблицу со старой схемой, чтобы увидеть разницу, если это необходимо.
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.