Urutan hibernasi tidak ada


88

Saya mencoba memutakhirkan hibernasi dari 4 ke 5 dalam proyek saya dengan 4.2versi pegas . Setelah peningkatan ini, saya menemukan kesalahan berikut di pelacakan tumpukan saya ketika saya memanggil metode untuk memperbarui.

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 

Saya mengubah Id yang bertambah otomatis dengan anotasi

@GeneratedValue(strategy=GenerationType.AUTO) 

masih kesalahannya.


4
coba atur di file konfigurasi `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

Jawaban:


123

Anda juga bisa meletakkan:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Dan biarkan DateBase mengelola penambahan kunci utama:

AUTO_INCREMENT PRIMARY KEY

13
Ini mungkin bagus dalam beberapa kasus, tetapi memiliki kelemahan yang jelas: setiap INSERTakan menyebabkan satu perjalanan tambahan ke Database untuk mengambil ID. Jadi, saat kekurangan ini bisa diterima, baiklah.
G. Demecki

@ G.Demecki Apakah Anda dapat mendiskusikan pro dan kontra penggunaan generator identitas hibernasi yang berbeda dengan metode perjalanan pulang pergi ini? Akan sangat berguna!
Jordan Mackie

83

Anda perlu mengatur Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. lihat dan tautkan .

Untuk versi hibernate 4.x yang lebih lama: <prop key="hibernate.id.new_generator_mappings">false</prop>


dimana ini bisa ditambahkan?
Samuel Thompson

1
tambahkan ini di properti hibernasi.
rParvathi


10
Jawaban Anda mungkin merupakan solusi untuk pertanyaan tersebut, tetapi tidak menjelaskan mengapa jawaban tersebut menyelesaikan masalah. Harap diingat, bahwa tautan cenderung mati.
Clijsters

51

Bekerja dengan Spring Boot

Larutan

Letakkan string di bawah ini dalam .application.properties

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

Penjelasan

Pada mode Hibernate 4.X default atribut ini adalah true.


30

Inilah alasan di balik kesalahan ini:

Ini akan mencari bagaimana database yang Anda gunakan menghasilkan id. Untuk MySql atau HSQSL, ada kolom kenaikan yang otomatis bertambah. Di Postgres atau Oracle, mereka menggunakan tabel urutan. Karena Anda tidak menentukan nama tabel urutan, itu akan mencari tabel urutan bernama hibernate_sequence dan menggunakannya sebagai default. Jadi Anda mungkin tidak memiliki tabel urutan seperti itu di database Anda dan sekarang Anda mendapatkan kesalahan itu.


1
harus ditandai sebagai jawaban karena ini menjelaskan hal-hal sederhana - tentu saja penambahan "spring.jpa.properties.hibernate.id.new_generator_mappings = false" harus disebutkan tetapi terima kasih.
nightfury

15

Saya mendapatkan kesalahan yang sama "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tabel 'mylocaldb.hibernate_sequence' tidak ada".

Menggunakan spring mvc 4.3.7 dan hibernate versi 5.2.9, aplikasi dibuat dengan konfigurasi berbasis spring java. Sekarang saya harus menambahkan hibernate.id.new_generator_mappingsproperti yang disebutkan oleh @Eva Mariam dalam kode saya seperti ini:

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

Dan itu bekerja seperti pesona.


14

FYI

Jika Anda menggunakan file hbm untuk menentukan pemetaan O / R.

Perhatikan itu:

Dalam Hibernate 5, nama param untuk nama urutan telah diubah .

Pengaturan berikut berfungsi dengan baik dalam mode Hibernasi 4 :

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

Tapi di Hibernate 5 , file pengaturan pemetaan yang sama akan menyebabkan kesalahan "hibernate_sequence tidak ada".

Untuk memperbaiki kesalahan ini, nama param harus berubah menjadi:

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

Masalah ini menyia-nyiakan saya 2, 3 jam.

Dan entah kenapa, sepertinya tidak ada dokumen tentang itu.

Saya harus membaca kode sumber org.hibernate.id.enhanced.SequenceStyleGenerator untuk mengetahuinya


7

Saat Anda menggunakan

@GeneratedValue(strategy=GenerationType.AUTO)

atau

@GeneratedValue yang merupakan cara singkat di atas, Hibernate mulai memutuskan strategi generasi terbaik untuk Anda, dalam hal ini telah memilih

GenerationType.SEQUENCE sebagai strategi dan itulah mengapa dicari

schemaName.hibernate_sequence yang merupakan tabel, untuk pembuatan id berbasis urutan.

Ketika Anda menggunakan GenerationType.SEQUENCEsebagai strategi, Anda perlu menyediakan hal @TableGenerator-hal berikut.

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

Ketika Anda menetapkan strategi, itu menjadi

@GeneratedValue(strategy = GenerationType.IDENTITY) .

masalah asli terselesaikan karena kemudian Hibernate berhenti mencari tabel urutan.


7

Kalau-kalau seseorang menarik rambut mereka dengan masalah ini seperti yang saya lakukan hari ini, saya tidak dapat menyelesaikan kesalahan ini sampai saya berubah

spring.jpa.hibernate.dll-auto=create

untuk

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

5

di hibernate 5.x, Anda harus menambahkan set hibernate.id.new_generator_mappings ke false di hibernate.cfg.xml

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

2

Anda juga bisa meletakkan:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Dan biarkan DateBase mengelola penambahan kunci utama:

AUTO_INCREMENT PRIMARY KEY

Jawaban di atas membantu saya.


2

Jika Anda menggunakan versi Hibernate sebelum Hibernate5 @GeneratedValue(strategy = GenerationType.IDENTITY)bekerja seperti pesona. Tetapi setelah Hibernate5, perbaikan berikut diperlukan.

@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

ALASAN

Kutipan dari masalah hibernasi

Saat ini, jika hibernate.id.new_generator_mappings disetel ke false, @GeneratedValue (strategy = GenerationType.AUTO) dipetakan ke asli. Jika properti ini benar (yang merupakan nilai cacat di 5.x), @GeneratedValue (strategy = GenerationType.AUTO) selalu dipetakan ke SequenceStyleGenerator.

Untuk alasan ini, pada database yang tidak mendukung urutan secara asli (misalnya MySQL) kita akan menggunakan generator TABEL daripada IDENTITAS.

Namun, generator TABLE, meskipun lebih portabel, menggunakan transaksi terpisah setiap kali nilai diambil dari database. Faktanya, meskipun IDENTITAS menonaktifkan pembaruan batch JDBC dan generator TABLE menggunakan pengoptimal gabungan, IDENTITAS tetap berskala lebih baik.


0

Ini mungkin disebabkan oleh HHH-10876 yang diperbaiki jadi pastikan Anda memperbarui ke:

  • Hibernasi ORM 5.2.1,
  • Hibernasi ORM 5.1.1,
  • Hibernasi ORM 5.0.11

1
Saya menggunakan Spring-data-jpa yang secara internal digunakan Hibernate 5.2.17.Finalsebagai implementasi. Saya masih mendapatkan masalah ini ketika GenerationTypeadalah AUTO.
TheCoder

0

Saya menambahkan urutan Hibernate di postgres. Jalankan kueri ini di Editor PostGres:

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

Saya akan mencari tahu pro / kontra penggunaan query tetapi untuk seseorang yang membutuhkan bantuan dapat menggunakan ini.


0

Dalam kasus saya, mengganti semua anotasi GenerationType.AUTOdengan GenerationType.SEQUENCEmenyelesaikan masalah.


-2

Jalankan kueri ini

create sequence hibernate_sequence start with 1 increment by 1

Meminta Anda untuk berbagi rincian bagaimana memecahkan masalah dan jawaban Anda lebih baik daripada jawaban lainnya ...
Suraj Kumar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.