Hibernate-последовательность не существует
Я попытался обновить hibernate с 4 до 5 в моем проекте с spring 4.2 версия. После этого обновления я обнаружил следующую ошибку в трассировке стека, когда я вызвал метод для обновления.
10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist
Я изменил автоматический увеличенный идентификатор с аннотацией
@GeneratedValue(strategy=GenerationType.AUTO)
тем не менее ошибка остается.
10 ответов:
вы также можете поместить :
@GeneratedValue(strategy = GenerationType.IDENTITY)и пусть DateBase управляет приращением первичного ключа:
AUTO_INCREMENT PRIMARY KEY
работа с Spring Boot
поместите строку ниже .приложение.свойства
решение
spring.jpa.properties.hibernate.id.new_generator_mappings=falseобъяснение
На Hibernate 4.X этот атрибут по умолчанию имеет значение
true.
Я получал ту же ошибку "com.mysql.интерфейс jdbc.исключения.jdbc4.MySQLSyntaxErrorException: таблица ' mylocaldb.hibernate_sequence' не существует".
используя spring mvc 4.3.7 и hibernate версии 5.2.9, приложение сделано с использованием конфигурации на основе spring java. Теперь я должен добавить
hibernate.id.new_generator_mappingsсвойство упоминается @Eva Mariam в моем коде следующим образом:@Autowired @Bean(name = "sessionFactory") public SessionFactory getSessionFactory(DataSource dataSource) { LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource); sessionBuilder.addProperties(getHibernateProperties()); sessionBuilder.addAnnotatedClasses(User.class); return sessionBuilder.buildSessionFactory(); } private Properties getHibernateProperties() { Properties properties = new Properties(); properties.put("hibernate.show_sql", "true"); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); properties.put("hibernate.id.new_generator_mappings","false"); return properties; }и он работал как шарм.
Это причина этой ошибки:
Это будет выглядеть как база данных, которую вы используете генерирует идентификаторы. Для MySql или HSQSL существуют поля инкремента, которые автоматически увеличиваются. В Postgres или Oracle они используют таблицы последовательностей. Поскольку вы не указали имя таблицы последовательности, она будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Поэтому у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.
FYI
Если вы используете файлы hbm для определения отображения O/R.
обратите внимание, что:
В Hibernate 5, имя параметра для имени последовательности было изменено.
следующая настройка работала нормально в Hibernate 4:
<generator class="sequence"> <param name="sequence">xxxxxx_seq</param> </generator>а в Hibernate 5, тот же файл настройки сопоставления вызовет ошибку "hibernate_sequence не существует".
чтобы исправить эту ошибку, параметр имя надо менять to:
<generator class="sequence"> <param name="sequence_name">xxxxxx_seq</param> </generator>эта проблема потратила меня 2, 3 часа.
и как-то, похоже, есть документ об этом.
мне нужно читать исходный код орг.гибернации.ИД.усиливается.SequenceStyleGenerator, чтобы понять это
в спящем режиме 5.x, вы должны добавить set hibernate.id.new_generator_mappings к false в hibernate.контекстно-свободная грамматика.xml
<session-factory> ...... <property name="show_sql">1</property> <property name="hibernate.id.new_generator_mappings">false</property> ...... </session-factory>
Это может быть вызвано HHH-10876 который был исправлен, поэтому убедитесь, что вы обновляете:
- Hibernate ORM 5.2.1,
- Hibernate ORM 5.1.1,
- Hibernate ORM 5.0.11
Я добавил последовательность гибернации в postgres. Запустите этот запрос в Редакторе PostGres:
CREATE SEQUENCE hibernate_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 2 CACHE 1; ALTER TABLE hibernate_sequence OWNER TO postgres;я узнаю плюсы / минусы использования запроса, но для тех, кто нуждается в помощи, может использовать это.
при использовании
@GeneratedValue(strategy=GenerationType.AUTO)или
@GeneratedValueчто короткий путь руки вышеуказанного, спящий режим начинает решать самое лучшее стратегия генерации для вас, в данном случае она выбрала
GenerationType.SEQUENCEкак стратегия и именно поэтому он ищет
schemaName.hibernate_sequenceкоторый представляет собой таблицу для генерации идентификаторов на основе последовательности.при использовании
GenerationType.SEQUENCEв качестве стратегии вам нужно предоставить@TableGeneratorследующим образом.@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator") @TableGenerator(name = "user_table_generator", table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE") @Column(name = "USER_ID") private long userId;когда вы устанавливаете стратегию это в
@GeneratedValue(strategy = GenerationType.IDENTITY).исходная проблема будет решена, потому что затем Hibernate перестанет искать таблицу последовательности.
Comments