Saya mencoba memutakhirkan hibernasi dari 4 ke 5 dalam proyek saya dengan 4.2
versi 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.
Jawaban:
Anda juga bisa meletakkan:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Dan biarkan DateBase mengelola penambahan kunci utama:
sumber
INSERT
akan menyebabkan satu perjalanan tambahan ke Database untuk mengambil ID. Jadi, saat kekurangan ini bisa diterima, baiklah.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>
sumber
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
.sumber
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.
sumber
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_mappings
properti 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.
sumber
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
sumber
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 memilihGenerationType.SEQUENCE
sebagai strategi dan itulah mengapa dicarischemaName.hibernate_sequence
yang merupakan tabel, untuk pembuatan id berbasis urutan.Ketika Anda menggunakan
GenerationType.SEQUENCE
sebagai 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.
sumber
Kalau-kalau seseorang menarik rambut mereka dengan masalah ini seperti yang saya lakukan hari ini, saya tidak dapat menyelesaikan kesalahan ini sampai saya berubah
untuk
sumber
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>
sumber
Anda juga bisa meletakkan:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Dan biarkan DateBase mengelola penambahan kunci utama:
Jawaban di atas membantu saya.
sumber
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
sumber
Ini mungkin disebabkan oleh HHH-10876 yang diperbaiki jadi pastikan Anda memperbarui ke:
sumber
Hibernate 5.2.17.Final
sebagai implementasi. Saya masih mendapatkan masalah ini ketikaGenerationType
adalahAUTO
.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.
sumber
Dalam kasus saya, mengganti semua anotasi
GenerationType.AUTO
denganGenerationType.SEQUENCE
menyelesaikan masalah.sumber
Jalankan kueri ini
create sequence hibernate_sequence start with 1 increment by 1
sumber