Hibernate-последовательность не существует


88

Я попытался обновить спящий режим с 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) 

все равно ошибка остается.


4
попробуйте установить в файле конфигурации `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Ева Мариам

Ответы:


123

Также можно поставить:

@GeneratedValue(strategy = GenerationType.IDENTITY)

И позвольте DateBase управлять увеличением первичного ключа:

AUTO_INCREMENT PRIMARY KEY

13
В некоторых случаях это может быть хорошо, но имеет очевидный недостаток: каждый INSERTвызовет один дополнительный обход базы данных для получения идентификатора. Так что, когда этот недостаток приемлем, хорошо.
G. Demecki

@ G.Demecki, не могли бы вы обсудить плюсы и минусы использования генератора идентификационных данных гибернации в отличие от этого метода приема-передачи? Было бы действительно полезно!
Jordan Mackie

82

Нужно установить для Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. см. И ссылку .

Для более старой версии hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


где это добавляется?
Сэмюэл Томпсон

1
добавьте это в свойствах гибернации.
rParvathi


10
Ваш ответ может быть решением вопроса, но он не объясняет, почему он решает проблему. Помните, что ссылки обычно умирают.
Clijsters

51

Работа с Spring Boot

Решение

Поместите строку ниже в .application.properties

spring.jpa.properties.hibernate.id.new_generator_mappings=false

Объяснение

В Hibernate 4.X этот атрибут по умолчанию true.


30

Это причина этой ошибки:

Он будет следить за тем, как база данных, которую вы используете, генерирует идентификаторы. Для MySql или HSQSL есть поля приращения, которые увеличиваются автоматически. В Postgres или Oracle они используют таблицы последовательности. Поскольку вы не указали имя таблицы последовательности, он будет искать таблицу последовательности с именем hibernate_sequence и использовать ее по умолчанию. Таким образом, у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получаете эту ошибку.


1
должен быть отмечен как ответ, так как это просто объясняет вещи - конечно, следует упомянуть добавление "spring.jpa.properties.hibernate.id.new_generator_mappings = false", но спасибо.
nightfury

15

Я получал ту же ошибку «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;
    }

И это сработало как шарм.


14

К вашему сведению

Если вы используете файлы 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, чтобы понять это


7

Когда вы используете

@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 перестанет искать таблицу последовательности.


6

На всякий случай, если кто-то выдернет волосы из-за этой проблемы, как я сделал сегодня, я не мог решить эту ошибку, пока не изменил

spring.jpa.hibernate.dll-auto=create

к

spring.jpa.properties.hibernate.hbm2ddl.auto=create

5

в 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>

2

Также можно поставить:

@GeneratedValue(strategy = GenerationType.IDENTITY)

И позвольте DateBase управлять увеличением первичного ключа:

AUTO_INCREMENT PRIMARY KEY

Приведенный выше ответ мне помог.


1

Если вы используете версию 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

В настоящее время, если для hibernate.id.new_generator_mappings установлено значение false, @GeneratedValue (strategy = GenerationType.AUTO) сопоставляется с native. Если это свойство истинно (что является значением по умолчанию в 5.x), @GeneratedValue (стратегия = GenerationType.AUTO) всегда сопоставляется с SequenceStyleGenerator.

По этой причине в любой базе данных, которая изначально не поддерживает последовательности (например, MySQL), мы собираемся использовать генератор TABLE вместо IDENTITY.

Однако генератор ТАБЛИЦ, хотя и более переносимый, использует отдельную транзакцию каждый раз, когда значение извлекается из базы данных. Фактически, даже если IDENTITY отключает пакетные обновления JDBC и генератор TABLE использует объединенный оптимизатор, IDENTITY все равно масштабируется лучше.


0

Это может быть вызвано HHH-10876, который был исправлен, поэтому убедитесь, что вы обновились до:

  • Hibernate ORM 5.2.1,
  • Hibernate ORM 5.1.1,
  • Hibernate ORM 5.0.11

1
Я использую Spring-data-jpa, который внутренне используется Hibernate 5.2.17.Finalв качестве реализации. У меня все еще GenerationTypeвозникает эта проблема, когда она есть AUTO.
TheCoder

0

Я добавил последовательность Hibernate в postgres. Запустите этот запрос в редакторе PostGres:

    CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

Я выясню плюсы и минусы использования запроса, но кто-то, кому нужна помощь, может это использовать.


0

В моем случае, заменяя все аннотации GenerationType.AUTOпо GenerationType.SEQUENCEрешаемой проблеме.


-2

Запустите этот запрос

create sequence hibernate_sequence start with 1 increment by 1

Попросите вас поделиться подробностями, как это решает проблему, и ваш ответ лучше, чем другие ответы ...
Сурадж Кумар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.