Bagaimana cara menetapkan nilai default di bidang Hibernate?
@ColumnDefault
Bagaimana cara menetapkan nilai default di bidang Hibernate?
@ColumnDefault
Jawaban:
Jika Anda ingin nilai default database nyata, gunakan columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Perhatikan bahwa string dalam columnDefinition
bergantung pada basis data. Juga jika Anda memilih opsi ini, Anda harus menggunakan dynamic-insert
, jadi Hibernate
jangan sertakan kolom dengan null
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;
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:
//... some code
private String myProperty;
//... some code
@PrePersist
public void 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.
public String getMyProperty() {
return myProperty;
}
public void setMyProperty(String myProperty) {
this.myProperty= myProperty;
}
Metode ini tidak tergantung pada tipe / versi database di bawah Hibernate. Nilai default diatur sebelum mempertahankan objek pemetaan.
setMyProperty
tidak digunakan oleh contoh Anda. Mengapa Anda memasukkannya?
bagaimana dengan hanya menetapkan nilai default untuk bidang tersebut?
private String _foo = "default";
//property here
public String Foo
jika mereka melewati nilai, maka itu akan ditimpa, jika tidak, Anda memiliki default.
gunakan hibernasi anotasi
@ColumnDefault("-1")
private Long clientId;
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]
Memetakan file hibernasi:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Lihat, kuncinya adalah masukkan = "false" update = "false"
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:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
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.
Bekerja dengan Oracle, saya mencoba memasukkan nilai default untuk Enum
Saya menemukan yang berikut ini untuk bekerja yang terbaik.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Anda dapat menggunakan konstruktor kelas java untuk menetapkan nilai default. Sebagai contoh:
public class Entity implements Serializable{
private Double field1
private Integer field2;
private T fieldN;
public Entity(){
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 @DynamicInsert
sebagai benar atau Anda hanya mendefinisikan @DynamicInsert
. Karena hibernate secara default dianggap benar. Pertimbangkan sebagai contoh yang diberikan:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
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:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Jika Anda membuat skema DDL dengan Hibernate, meskipun ini tidak disarankan, Anda dapat menggunakan columnDefinition
atribut @Column
anotasi JPA , seperti ini:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
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 mengatur DEFAULT
klausa SQL dalam skrip, bukan dalam anotasi JPA.
Untuk detail lebih lanjut tentang menggunakan
@Generated
anotasi, periksa artikel ini .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
Saya bekerja dengan hibernate 5 dan postgres, dan ini berhasil dari saya.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
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.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}