Hazırda bekletme dizisi mevcut değil


88

Spring 4.2versiyonuyla projemde hazırda bekletme modunu 4'ten 5'e yükseltmeye çalıştım . Bu yükseltmeden sonra, güncelleme için bir yöntem çağırdığımda yığın izlememde aşağıdaki hatayı buldum.

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 

Ek açıklamayla otomatik olarak artırılan kimliği değiştirdim

@GeneratedValue(strategy=GenerationType.AUTO) 

hala hata kalır.


4
"<prop key =" hibernate.id.new_generator_mappings "> false </prop> yapılandırma dosyasında ayarlamayı deneyin
Eva Mariam

Yanıtlar:


123

Ayrıca şunları da koyabilirsiniz:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Ve DateBase'in birincil anahtarın artışını yönetmesine izin verin:

AUTO_INCREMENT PRIMARY KEY

13
Bu bazı durumlarda iyi olabilir, ancak bariz bir dezavantajı vardır: her INSERTbiri, Kimliği almak için Veritabanına bir ek gidiş-dönüş yolculuğuna neden olur. Yani bu dezavantaj kabul edilebilir olduğunda, iyi.
G. Demecki

@ G.Demecki bu gidiş-dönüş yönteminin aksine hazırda bekletme kimlik oluşturucusunu kullanmanın artılarını ve eksilerini tartışabilir misiniz? Gerçekten yararlı olur!
Jordan Mackie

83

Hibernate5.x için ayarlamanız gerekiyor <property name="hibernate.id.new_generator_mappings">false</property>.. bakın ve bağlanın .

Hazırda bekletme 4.x'in eski sürümü için: <prop key="hibernate.id.new_generator_mappings">false</prop>


bu nereye eklenir?
Samuel Thompson

1
bunu hazırda bekleme özelliklerine ekleyin.
rParvathi


10
Cevabınız sorunun çözümü olabilir, ancak sorunu neden çözdüğünü açıklamıyor. Lütfen bağlantıların ölme eğiliminde olduğunu unutmayın.
Clijsters

51

Spring Boot ile Çalışma

Çözüm

Aşağıdaki dizeyi .application.properties içine koyun

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

Açıklama

Hazırda Bekletme 4.X'te bu özellik varsayılan değerdir true.


30

Bu hatanın arkasındaki sebep budur:

Kullandığınız veritabanının kimliklerini nasıl oluşturduğuna bakacaktır. MySql veya HSQSL için, otomatik olarak artan artış alanları vardır. Postgres veya Oracle'da sıra tabloları kullanırlar. Bir sıra tablosu adı belirtmediğiniz için, hibernate_sequence adlı bir sıra tablosu arayacak ve bunu varsayılan olarak kullanacaktır. Yani muhtemelen veritabanınızda böyle bir sıralama tablosu yok ve şimdi bu hatayı alıyorsunuz.


1
Bu, her şeyi basitçe açıkladığı için bir yanıt olarak işaretlenmelidir - tabii ki "spring.jpa.properties.hibernate.id.new_generator_mappings = false" ekinden bahsedilmeli, ancak teşekkürler.
nightfury

15

Aynı hatayı alıyordum "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tablo 'mylocaldb.hibernate_sequence' mevcut değil".

Spring mvc 4.3.7 ve hibernate sürüm 5.2.9 kullanılarak, uygulama spring java tabanlı konfigürasyon kullanılarak yapılmıştır. Şimdi hibernate.id.new_generator_mappings@Eva Mariam tarafından kodumda belirtilen mülkü şu şekilde eklemeliyim :

@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;
    }

Ve çekicilik gibi çalıştı.


14

Bilginize

O / R eşlemesini tanımlamak için hbm dosyaları kullanıyorsanız.

Dikkat edin:

Hazırda Bekletme 5'te, sıra adı için parametre adı değiştirildi .

Aşağıdaki ayar Hazırda Bekleme 4'te iyi çalıştı :

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

Ancak Hazırda Bekletme 5'te , aynı eşleme ayarı dosyası "hibernate_sequence yok" hatasına neden olur.

Bu hatayı düzeltmek için, param adı şu şekilde değiştirilmelidir :

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

Bu sorun beni 2, 3 saatini boşa harcadı.

Ve bir şekilde, bununla ilgili bir belge yok gibi görünüyor .

Bunu anlamak için org.hibernate.id.enhanced.SequenceStyleGenerator kaynak kodunu okumam gerekiyor


7

Kullandığınızda

@GeneratedValue(strategy=GenerationType.AUTO)

veya

@GeneratedValue Yukarıdakilerin kısa yolu olan Hibernate sizin için en iyi üretim stratejisine karar vermeye başlar, bu durumda seçmiştir.

GenerationType.SEQUENCE strateji olarak ve bu yüzden arıyor

schemaName.hibernate_sequence bu, sıra tabanlı kimlik üretimi için bir tablodur.

Eğer kullandığınız zaman GenerationType.SEQUENCEstrateji olarak belirtmeniz gereken @TableGeneratorolarak izler.

     @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;

Stratejiyi belirlediğinizde

@GeneratedValue(strategy = GenerationType.IDENTITY) .

orijinal sorun çözüldü çünkü daha sonra Hazırda bekletme sırası tablosu aramayı durdurdu.


7

Sadece bugün yaptığım gibi birisi bu problemle saçını çekerse, değiştirene kadar bu hatayı çözemedim

spring.jpa.hibernate.dll-auto=create

-e

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

5

hibernate 5.x'te, hibernate.cfg.xml'de set hibernate.id.new_generator_mappings'i false olarak eklemelisiniz

<session-factory>
    ......
    <property name="show_sql">1</property>
    <property name="hibernate.id.new_generator_mappings">false</property>
     ......
 </session-factory>

2

Ayrıca şunları da koyabilirsiniz:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Ve DateBase'in birincil anahtarın artışını yönetmesine izin verin:

AUTO_INCREMENT PRIMARY KEY

Yukarıdaki cevap bana yardımcı oldu.


2

Hibernate5'ten önceki Hibernate sürümünü kullanıyorsanız bir sihir @GeneratedValue(strategy = GenerationType.IDENTITY)gibi çalışır. Ancak Hibernate5'ten sonra aşağıdaki düzeltme gereklidir.

@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

NEDEN

Hazırda bekletme sorunundan alıntı

Şu anda, hibernate.id.new_generator_mappings false olarak ayarlanmışsa, @GeneratedValue (strateji = GenerationType.AUTO) yerel ile eşlenir. Bu özellik doğruysa (5.x'teki varsayılan değerdir), @GeneratedValue (strateji = GenerationType.AUTO) her zaman SequenceStyleGenerator ile eşlenir.

Bu nedenle, dizileri yerel olarak desteklemeyen herhangi bir veritabanında (örn. MySQL) IDENTITY yerine TABLE oluşturucuyu kullanacağız.

Bununla birlikte, TABLO üreteci, daha taşınabilir olmasına rağmen, veritabanından bir değer her getirildiğinde ayrı bir işlem kullanır. Aslında, IDENTITY JDBC toplu güncellemelerini devre dışı bıraksa ve TABLE oluşturucusu havuzlanmış optimize ediciyi kullansa bile, IDENTITY hala daha iyi ölçeklenir.


0

Bu, düzeltilen HHH-10876'dan kaynaklanıyor olabilir, bu nedenle aşağıdakileri güncellediğinizden emin olun:

  • Hazırda Beklet ORM 5.2.1,
  • Hazırda Beklet ORM 5.1.1,
  • Hazırda Beklet ORM 5.0.11

1
Dahili Hibernate 5.2.17.Finalolarak bir uygulama olarak kullanılan Spring-data-jpa kullanıyorum . Ben hala bu sorunu alıyorum GenerationTypeolduğunu AUTO.
TheCoder

0

Postgres'e Hibernate dizisi ekledim. Bu sorguyu PostGres Editor'da çalıştırın:

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

Sorguyu kullanmanın artılarını / eksilerini öğreneceğim, ancak yardıma ihtiyacı olan biri bunu kullanabilir.


0

Benim durumumda, tüm açıklamaları değiştirerek GenerationType.AUTOtarafından GenerationType.SEQUENCEçözüldü sorunu.


-2

Bu sorguyu çalıştırın

create sequence hibernate_sequence start with 1 increment by 1

Sorunu nasıl çözdüğünü ve cevabınız diğer cevaplardan daha iyi olan ayrıntıları paylaşmanızı rica ediyorum ...
Suraj Kumar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.