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) 


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

1425   10  

10 ответов:

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

AUTO_INCREMENT PRIMARY KEY

необходимо указать <prop key="hibernate.id.new_generator_mappings">false</prop>.. смотрите ссылке и ссылке.

работа с 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

    Ничего не найдено.