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


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.