Cara mengatur nilai properti entitas default dengan Hibernate


Jawaban:


185

Jika Anda ingin nilai default database nyata, gunakan columnDefinition:

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

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;


6
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.
Reaz Murshed

3
Saya akan merekomendasikan menggunakan @ColumnDefault alih-alih columnDefinition karena lebih banyak database independen docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh

35

Anda dapat menggunakan @PrePersistanotasi 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.


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?

private String _foo = "default";

//property here
public String Foo

jika mereka melewati nilai, maka itu akan ditimpa, jika tidak, Anda memiliki default.


8
@michali: peran nilai default tidak mencegah pembaruan nilai, bukan?
Janusz Lenar

27

gunakan hibernasi anotasi

@ColumnDefault("-1")
private Long clientId;

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]

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"


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:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

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.


Ini berfungsi baik untuk kolom seperti "CreatedAt" di mana Anda selalu ingin menggunakan DB default. Terima kasih!
Michal Filip

4

Gunakan @ColumnDefault()anotasi. Ini hanya hibernasi.


2

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;

2

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
...

}

2

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:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}

2

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 createdOnatribut entitas default ke waktu saat ini, seperti ini:

@Column(
    name = "created_on"
)
private LocalDateTime 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)
private LocalDateTime 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 .



1

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;

0

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;


-3

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