Saya memiliki aplikasi Spring Boot dengan ketergantungan spring-boot-starter-data-jpa
. Kelas entitas saya memiliki anotasi kolom dengan nama kolom. Sebagai contoh:
@Column(name="TestName")
private String testName;
SQL yang dihasilkan oleh ini dibuat test_name
sebagai nama kolom. Setelah mencari solusi, saya menemukan bahwa spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
memecahkan masalah (nama kolom diambil dari anotasi kolom).
Namun, pertanyaan saya adalah mengapa tanpa naming_strategy yang disetel ke EJB3NamingStrategy
JPA mengabaikan anotasi kolom? Mungkin dialek hibernasi ada hubungannya dengan itu? Saya terhubung ke MS SQL 2014 Express dan log saya berisi:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
sumber
sumber
@Column(name="...")
anotasi, misalnya saat Anda menggunakan jenis akses selain yang diharapkan, tetapi tidak demikian di sini.Jawaban:
Untuk hibernate5 saya memecahkan masalah ini dengan meletakkan baris berikutnya di file application.properties saya:
sumber
Secara default Spring menggunakan
org.springframework.boot.orm.jpa.SpringNamingStrategy
untuk menghasilkan nama tabel. Ini adalah ekstensi yang sangat tipis dariorg.hibernate.cfg.ImprovedNamingStrategy
. ThetableName
metode di kelas yang dilewatkan sumberString
nilai tetapi tidak menyadari jika itu berasal dari@Column.name
atribut atau jika telah secara implisit dihasilkan dari nama field.Ini
ImprovedNamingStrategy
akan dikonversiCamelCase
keSNAKE_CASE
tempat yangEJB3NamingStrategy
hanya menggunakan nama tabel yang tidak berubah.Jika Anda tidak ingin mengubah strategi penamaan, Anda selalu dapat menentukan nama kolom Anda dalam huruf kecil:
sumber
Tampaknya
sepenuhnya diabaikan kecuali jika ada
ditentukan, jadi bagi saya ini adalah bug.
Saya menghabiskan beberapa jam mencoba mencari tahu mengapa @Column (name = "..") diabaikan.
sumber
Strategi default untuk
@Column(name="TestName")
adalahtest_name
, ini adalah perilaku yang benar!Jika Anda memiliki kolom bernama
TestName
dalam database Anda, Anda harus mengubah anotasi Kolom menjadi@Column(name="testname")
.Ini berfungsi karena database tidak peduli jika Anda menamai kolom Anda TestName atau testname ( nama kolom tidak peka huruf besar / kecil !! ).
Namun berhati-hatilah, hal yang sama tidak berlaku untuk nama database dan nama tabel, yang case-sensitive pada sistem Unix tetapi case-sensitive pada sistem Windows (fakta yang mungkin membuat banyak orang tetap terjaga di malam hari, bekerja di windows tetapi menggunakan di linux :))
sumber
Satu-satunya solusi yang berhasil untuk saya adalah solusi yang diposting oleh teteArg di atas. Saya menggunakan Spring Boot 1.4.2 w / Hibernate 5. Yaitu
Untuk wawasan tambahan, saya memposting jejak panggilan sehingga jelas apa yang membuat Spring menjadi Hibernate untuk mengatur strategi penamaan.
sumber
teteArg , terima kasih banyak. Hanya informasi tambahan jadi, semua orang yang memiliki pertanyaan ini akan dapat memahami alasannya.
Apa yang teteArg katakan diindikasikan pada Spring Boot Common Properties: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Rupanya, spring.jpa.hibernate.naming.strategy bukan properti yang didukung untuk implementasi JPA Musim Semi menggunakan Hibernate 5.
sumber
Ternyata saya hanya harus pindah agama
@column
testName nama menjadi semua huruf kecil, karena awalnya menggunakan huruf unta.Meskipun saya tidak dapat menggunakan jawaban resmi, pertanyaan tersebut dapat membantu saya memecahkan masalah saya dengan memberi tahu saya apa yang harus diselidiki.
Perubahan:
Untuk:
sumber
Jika Anda ingin menggunakan @Column (...), gunakan selalu huruf kecil meskipun kolom DB Anda yang sebenarnya menggunakan huruf besar-kecil.
Contoh: Jika nama kolom DB Anda yang sebenarnya
TestName
kemudian digunakan:Jika Anda tidak menyukainya, cukup ubah nama kolom DB yang sebenarnya menjadi: test_name
sumber
Dalam kasus saya, anotasi berada pada metode getter () dan bukan pada bidang itu sendiri (porting dari aplikasi warisan).
Spring mengabaikan anotasi dalam kasus ini juga, tetapi tidak mengeluh. Solusinya adalah dengan memindahkannya ke lapangan alih-alih pengambil.
sumber