Послідовність сплячого режиму не існує


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, чи зможете ви обговорити плюси і мінуси використання генератора ідентифікацій сплячого режиму на відміну від цього методу туди-назад? Було б дуже корисно!
— 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
Ваша відповідь може бути рішенням питання, але вона не пояснює, чому вона вирішує проблему. Будь ласка, майте на увазі, що посилання, як правило, гинуть.
— Клайстерс

51

Робота з Spring Boot

Рішення

Вставте рядок нижче в .application.properties

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

Пояснення

У режимі глибокого сну 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: Таблиця '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

FYI

Якщо ви використовуєте файли hbm для визначення відображення O / R.

Зверніть увагу, що:

У сплячому режимі 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

Коли ви використовуєте

@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) .

оригінальна проблема вирішується, оскільки тоді сплячий режим перестає шукати таблицю послідовностей.


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.id.new_generator_mappings встановлено значення false, @GeneratedValue (strategy = GenerationType.AUTO) відображається на рідному. Якщо це властивість істинне (що є значенням відхилення в 5.x), @GeneratedValue (стратегія = GenerationType.AUTO) завжди відображається у SequenceStyleGenerator.

З цієї причини в будь-якій базі даних, яка не підтримує послідовно послідовності (наприклад, MySQL), ми будемо використовувати генератор TABLE замість IDENTITY.

Однак генератор TABLE, хоча і є більш портативним, використовує окрему транзакцію кожного разу, коли значення отримується з бази даних. Насправді, навіть якщо 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.