Я попытался обновить спящий режим с 4 до 5 в своем проекте с весенней 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)
все равно ошибка остается.
Ответы:
Также можно поставить:
@GeneratedValue(strategy = GenerationType.IDENTITY)
И позвольте DateBase управлять увеличением первичного ключа:
источник
INSERT
вызовет один дополнительный обход базы данных для получения идентификатора. Так что, когда этот недостаток приемлем, хорошо.Нужно установить для Hibernate5.x
<property name="hibernate.id.new_generator_mappings">false</property>
.. см. И ссылку .Для более старой версии hibernate 4.x:
<prop key="hibernate.id.new_generator_mappings">false</prop>
источник
Работа с Spring Boot
Решение
Поместите строку ниже в .application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
Объяснение
В Hibernate 4.X этот атрибут по умолчанию
true
.источник
Это причина этой ошибки:
Он будет следить за тем, как база данных, которую вы используете, генерирует идентификаторы. Для MySql или HSQSL есть поля приращения, которые увеличиваются автоматически. В Postgres или Oracle они используют таблицы последовательности. Поскольку вы не указали имя таблицы последовательности, он будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Таким образом, у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.
источник
Я получал ту же ошибку «com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table '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; }
И это сработало как шарм.
источник
К вашему сведению
Если вы используете файлы hbm для определения сопоставления O / R.
Заметить, что:
В Hibernate 5 имя параметра для имени последовательности было изменено .
Следующая настройка отлично работала в Hibernate 4 :
<generator class="sequence"> <param name="sequence">xxxxxx_seq</param> </generator>
Но в Hibernate 5 тот же файл настроек сопоставления вызовет ошибку «hibernate_sequence not exists».
Чтобы исправить эту ошибку, имя параметра должно измениться на:
<generator class="sequence"> <param name="sequence_name">xxxxxx_seq</param> </generator>
Эта проблема потратила у меня 2, 3 часа.
И почему-то вроде документа об этом нет.
Мне нужно прочитать исходный код org.hibernate.id.enhanced.SequenceStyleGenerator, чтобы понять это
источник
Когда вы используете
@GeneratedValue(strategy=GenerationType.AUTO)
или
@GeneratedValue
что является кратким описанием вышеизложенного, Hibernate начинает выбирать лучшую стратегию генерации для вас, в этом случае он выбрал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 перестанет искать таблицу последовательности.
источник
На всякий случай, если кто-то выдернет волосы из-за этой проблемы, как я сделал сегодня, я не мог решить эту ошибку, пока не изменил
к
источник
в hibernate 5.x вы должны добавить для hibernate.id.new_generator_mappings значение false в hibernate.cfg.xml
<session-factory> ...... <property name="show_sql">1</property> <property name="hibernate.id.new_generator_mappings">false</property> ...... </session-factory>
источник
Также можно поставить:
@GeneratedValue(strategy = GenerationType.IDENTITY)
И позвольте DateBase управлять увеличением первичного ключа:
Приведенный выше ответ мне помог.
источник
Если вы используете версию 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
ПРИЧИНА
Выдержка из hibernate-issue
источник
Это может быть вызвано HHH-10876, который был исправлен, поэтому убедитесь, что вы обновились до:
источник
Hibernate 5.2.17.Final
в качестве реализации. У меня все ещеGenerationType
возникает эта проблема, когда она естьAUTO
.Я добавил последовательность Hibernate в postgres. Запустите этот запрос в редакторе PostGres:
CREATE SEQUENCE hibernate_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 2 CACHE 1; ALTER TABLE hibernate_sequence OWNER TO postgres;
Я выясню плюсы и минусы использования запроса, но кто-то, кому нужна помощь, может это использовать.
источник
В моем случае, заменяя все аннотации
GenerationType.AUTO
поGenerationType.SEQUENCE
решаемой проблеме.источник
Запустите этот запрос
create sequence hibernate_sequence start with 1 increment by 1
источник