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) 

по-прежнему сохраняется ошибка.

Ответ 1

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

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

Ответ 2

Вы также можете поставить:

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

AUTO_INCREMENT PRIMARY KEY

Ответ 3

Работа с Spring Boot

Решение

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

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

объяснение

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

Ответ 4

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

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

Ответ 5

Я получаю ту же ошибку "com.mysql.jdbc.exceptions.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;
    }

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

Ответ 6

FYI

Если вы используете файлы hbm для определения отображения O/R.

Обратите внимание:

В Hibernate 5, имя параметра для имени последовательности было изменено.

Следующий параметр работал в Hibernate 4:

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>

Но в Hibernate 5 тот же файл настроек сопоставления приведет к ошибке "hibernate_sequence не существует".

Чтобы исправить эту ошибку, имя параметра должно изменить на:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>

Эта проблема потратила на меня 2, 3 часа.

И каким-то образом это выглядит как без документа.

Мне нужно прочитать исходный код org.hibernate.id.enhanced.SequenceStyleGenerator, чтобы понять его

Ответ 7

в hibernate 5.x вы должны добавить set 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>

Ответ 8

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

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

Ответ 9

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

spring.jpa.hibernate.dll-auto=create

в

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

Ответ 10

Я использую Spring Boot и я исправил это, добавив следующую строку в файл application.properties:

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

Ответ 11

Вы также можете поставить:

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

AUTO_INCREMENT PRIMARY KEY

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

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

create sequence hibernate_sequence start with 1 increment by 1