Apakah Anda menggunakan file konfigurasi XML atau anotasi?
Bruno
2
Jawaban di bawah ini hanya memberikan solusi JPA, yang benar tetapi. Untuk solusi Hibernate lihat stackoverflow.com/questions/28107554/... Anda harus menggunakan@ColumnDefault
pdem
Jawaban:
185
Jika Anda ingin nilai default database nyata, gunakan columnDefinition:
Perhatikan bahwa string dalam columnDefinitionbergantung pada basis data. Juga jika Anda memilih opsi ini, Anda harus menggunakan dynamic-insert, jadi Hibernatejangan sertakan kolom dengan nullnilai pada sisipan. Kalau tidak, berbicara tentang standar tidak relevan.
Tetapi jika Anda tidak ingin nilai default database, tetapi hanya nilai default dalam kode Java Anda, cukup inisialisasi variabel Anda seperti itu - private Integer myColumn = 100;
Dengan anotasi: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto
9
Saat org.hibernate.annotations.Entityini sudah usang. @DynamicInsertsebaiknya digunakan anotasi.
jannis
1
Saya tidak akan merekomendasikan menggunakan columnDefinition untuk situasi ini, ini tidak portabel dari database ke yang lain, dan Anda perlu tahu bahasa SQL spesifik server Anda.
pdem
@DynamicInsert perlu ditambahkan pada kelas database pojo.
Anda dapat menggunakan @PrePersistanotasi dan mengatur nilai default di tahap pra-persisten.
Sesuatu seperti itu:
//... some codeprivateString myProperty;//... some code@PrePersistpublicvoid prePersist(){if(myProperty ==null)//We set default value in case if the value is not set yet.
myProperty ="Default value";}// property methods@Column(nullable =false)//restricting Null value on database level.publicString getMyProperty(){return myProperty;}publicvoid setMyProperty(String myProperty){this.myProperty= myProperty;}
Metode ini tidak tergantung pada tipe / versi database di bawah Hibernate. Nilai default diatur sebelum mempertahankan objek pemetaan.
Mengingat itu setMyPropertytidak digunakan oleh contoh Anda. Mengapa Anda memasukkannya?
EndermanAPM
Saya hanya memberikan contoh anotasi hibernasi untuk properti java standar (variabel pribadi dengan metode get / set publik). Saya perhatikan dan dikoreksi satu kesalahan ... Jenis string metode set argumet hilang.
dbricman
30
bagaimana dengan hanya menetapkan nilai default untuk bidang tersebut?
Terima kasih, ini berhasil. Tetapi saya harus membuat ulang tabel.
Yamashiro Rion
1
Ini harus menjadi solusi nyata, menggunakan columnDefinition seperti yang diusulkan oleh jawaban saat ini adalah terburu-buru dan Anda harus memasukkan tipenya. Anotasi @ColumnDefault jauh lebih mudah menurut saya.
Judos
7
Jika Anda ingin melakukannya di basis data:
Tetapkan nilai default dalam basis data (sampel server sql):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Ada masalah untuk Oracle: Jika properti tidak nol, nilainya MASIH nilai default. Bukan nilai sebenarnya.
youngzy
5
Salah satu solusinya adalah meminta pengambil getter Anda untuk melihat apakah nilai apa pun yang Anda kerjakan adalah nol (atau apa pun keadaannya yang tidak diinisialisasi) dan jika sama dengan itu, kembalikan nilai default Anda:
Saya menggunakan mapper yang memanggil setter pada objek entitas saya. Apakah ada kerugian menggunakan cuplikan kode Anda pada pengambil dan penyetel?
Eric Francis
4
Saya mencari ini dan menemukan banyak jawaban untuk nilai default untuk kolom. Jika Anda ingin menggunakan nilai default yang didefinisikan dalam Tabel SQL kemudian di @Column Annotation gunakan "insertable = false" . disisipkan
@ Kolom (nama = kolom Nama, panjang = lengthOfColumn, dapat dimasukkan = salah)
Jika Anda menggunakan columnDefination it @Column annotation mungkin itu tidak akan berfungsi karena tergantung pada Database.
Anda dapat menggunakan konstruktor kelas java untuk menetapkan nilai default. Sebagai contoh:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){this.field1=0.0;this.field2=0;...this.fieldN=<your default value>}//Setters and Getters...}
Untuk menggunakan nilai default dari kolom tabel mana saja. maka Anda harus mendefinisikan @DynamicInsertsebagai benar atau Anda hanya mendefinisikan @DynamicInsert. Karena hibernate secara default dianggap benar. Pertimbangkan sebagai contoh yang diberikan:
Jika Anda ingin menetapkan nilai properti entitas default, maka Anda bisa menginisialisasi bidang entitas menggunakan nilai default.
Misalnya, Anda dapat mengatur createdOnatribut entitas default ke waktu saat ini, seperti ini:
@Column(
name ="created_on")privateLocalDateTime createdOn =LocalDateTime.now();
Nilai kolom default
Jika Anda membuat skema DDL dengan Hibernate, meskipun ini tidak disarankan, Anda dapat menggunakan columnDefinitionatribut @Columnanotasi JPA , seperti ini:
@Column(
name ="created_on",
columnDefinition ="DATETIME(6) DEFAULT CURRENT_TIMESTAMP")@Generated(GenerationTime.INSERT)privateLocalDateTime createdOn;
The @Generatedpenjelasan diperlukan karena kita ingin menginstruksikan Hibernate untuk reload entitas setelah Konteks Kegigihan memerah, jika tidak, nilai database yang dihasilkan tidak akan disinkronkan dengan di memori entitas negara.
Alih-alih menggunakan columnDefinition, Anda lebih baik menggunakan alat seperti Flyway dan menggunakan skrip migrasi inkremental DDL. Dengan begitu, Anda akan mengatur DEFAULTklausa SQL dalam skrip, bukan dalam anotasi JPA.
Untuk detail lebih lanjut tentang menggunakan @Generatedanotasi, periksa artikel ini .
Jika Anda ingin menetapkan nilai default dalam hal basis data, cukup atur @Column( columnDefinition = "int default 1")
Tetapi jika Anda bermaksud untuk menetapkan nilai default di aplikasi java Anda, Anda dapat mengaturnya pada atribut kelas Anda seperti ini: private Integer attribute = 1;
Saran di atas berfungsi, tetapi hanya jika anotasi digunakan pada metode pengambil. Jika anotasi digunakan di mana anggota dinyatakan, tidak ada yang akan terjadi.
@ColumnDefault
Jawaban:
Jika Anda ingin nilai default database nyata, gunakan
columnDefinition
:Perhatikan bahwa string dalam
columnDefinition
bergantung pada basis data. Juga jika Anda memilih opsi ini, Anda harus menggunakandynamic-insert
, jadiHibernate
jangan sertakan kolom dengannull
nilai pada sisipan. Kalau tidak, berbicara tentang standar tidak relevan.Tetapi jika Anda tidak ingin nilai default database, tetapi hanya nilai default dalam kode Java Anda, cukup inisialisasi variabel Anda seperti itu -
private Integer myColumn = 100;
sumber
org.hibernate.annotations.Entity
ini sudah usang.@DynamicInsert
sebaiknya digunakan anotasi.Anda dapat menggunakan
@PrePersist
anotasi dan mengatur nilai default di tahap pra-persisten.Sesuatu seperti itu:
Metode ini tidak tergantung pada tipe / versi database di bawah Hibernate. Nilai default diatur sebelum mempertahankan objek pemetaan.
sumber
setMyProperty
tidak digunakan oleh contoh Anda. Mengapa Anda memasukkannya?bagaimana dengan hanya menetapkan nilai default untuk bidang tersebut?
jika mereka melewati nilai, maka itu akan ditimpa, jika tidak, Anda memiliki default.
sumber
gunakan hibernasi anotasi
sumber
Jika Anda ingin melakukannya di basis data:
Tetapkan nilai default dalam basis data (sampel server sql):
Memetakan file hibernasi:
Lihat, kuncinya adalah masukkan = "false" update = "false"
sumber
Salah satu solusinya adalah meminta pengambil getter Anda untuk melihat apakah nilai apa pun yang Anda kerjakan adalah nol (atau apa pun keadaannya yang tidak diinisialisasi) dan jika sama dengan itu, kembalikan nilai default Anda:
sumber
Saya mencari ini dan menemukan banyak jawaban untuk nilai default untuk kolom. Jika Anda ingin menggunakan nilai default yang didefinisikan dalam Tabel SQL kemudian di @Column Annotation gunakan "insertable = false" . disisipkan
Jika Anda menggunakan columnDefination it @Column annotation mungkin itu tidak akan berfungsi karena tergantung pada Database.
sumber
Gunakan
@ColumnDefault()
anotasi. Ini hanya hibernasi.sumber
Bekerja dengan Oracle, saya mencoba memasukkan nilai default untuk Enum
Saya menemukan yang berikut ini untuk bekerja yang terbaik.
sumber
Anda dapat menggunakan konstruktor kelas java untuk menetapkan nilai default. Sebagai contoh:
sumber
Untuk menggunakan nilai default dari kolom tabel mana saja. maka Anda harus mendefinisikan
@DynamicInsert
sebagai benar atau Anda hanya mendefinisikan@DynamicInsert
. Karena hibernate secara default dianggap benar. Pertimbangkan sebagai contoh yang diberikan:sumber
Nilai properti entitas default
Jika Anda ingin menetapkan nilai properti entitas default, maka Anda bisa menginisialisasi bidang entitas menggunakan nilai default.
Misalnya, Anda dapat mengatur
createdOn
atribut entitas default ke waktu saat ini, seperti ini:Nilai kolom default
Jika Anda membuat skema DDL dengan Hibernate, meskipun ini tidak disarankan, Anda dapat menggunakan
columnDefinition
atribut@Column
anotasi JPA , seperti ini:The
@Generated
penjelasan diperlukan karena kita ingin menginstruksikan Hibernate untuk reload entitas setelah Konteks Kegigihan memerah, jika tidak, nilai database yang dihasilkan tidak akan disinkronkan dengan di memori entitas negara.Alih-alih menggunakan
columnDefinition
, Anda lebih baik menggunakan alat seperti Flyway dan menggunakan skrip migrasi inkremental DDL. Dengan begitu, Anda akan mengaturDEFAULT
klausa SQL dalam skrip, bukan dalam anotasi JPA.sumber
sumber
Saya bekerja dengan hibernate 5 dan postgres, dan ini berhasil dari saya.
sumber
Jika Anda ingin menetapkan nilai default dalam hal basis data, cukup atur
@Column( columnDefinition = "int default 1")
Tetapi jika Anda bermaksud untuk menetapkan nilai default di aplikasi java Anda, Anda dapat mengaturnya pada atribut kelas Anda seperti ini:
private Integer attribute = 1;
sumber
Saran di atas berfungsi, tetapi hanya jika anotasi digunakan pada metode pengambil. Jika anotasi digunakan di mana anggota dinyatakan, tidak ada yang akan terjadi.
sumber