it-swarm.com.ru

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

Я попытался обновить hibernate с 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) 

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

72
rParvathi

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

70
rParvathi

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

И пусть база данных управляет приращением первичного ключа:

AUTO_INCREMENT PRIMARY KEY
99
Kikou

Работа с Spring Boot

Решение

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

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

Объяснение

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

26
RivanMota

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

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

20
Vikki

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

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

14
Rajan Chauhan

FYI

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

Заметить, что:

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

Следующая настройка работала нормально в Hibernate 4:

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

Но в Hibernate 5 тот же самый файл настроек отображения вызовет ошибку «hibernate_sequence not Существует».

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

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

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

И почему-то, похоже, что нет документа об этом.

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

11
Li Ying

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

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

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

2
Kalpa

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

spring.jpa.properties.hibernate.id.new_generator_mappings = false    
1
ankur saxena

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

И пусть база данных управляет приращением первичного ключа:

AUTO_INCREMENT PRIMARY KEY

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

0
Pradeep Singarakannan

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

spring.jpa.hibernate.dll-auto=create

в

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

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

0
wwesantos

Я добавил последовательность 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
Chinmoy

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

  • Hibernate ORM 5.2.1, 
  • Hibernate ORM 5.1.1, 
  • Hibernate ORM 5.0.11
0
Vlad Mihalcea