Seperti yang dibutuhkan JPA, @Entity
kelas harus memiliki konstruktor default (non-arg) untuk instantiate objek ketika mengambilnya dari database.
Di Kotlin, properti sangat mudah untuk menyatakan dalam konstruktor utama, seperti dalam contoh berikut:
class Person(val name: String, val age: Int) { /* ... */ }
Tetapi ketika konstruktor non-arg dideklarasikan sebagai konstruktor sekunder, ia membutuhkan nilai untuk konstruktor primer untuk dilewati, sehingga beberapa nilai valid diperlukan untuk mereka, seperti di sini:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Dalam kasus ketika properti memiliki beberapa tipe yang lebih kompleks daripada hanya String
dan Int
dan mereka tidak dapat dibatalkan, terlihat sangat buruk untuk memberikan nilai untuk mereka, terutama ketika ada banyak kode dalam konstruktor dan init
blok primer dan ketika parameter digunakan secara aktif - - ketika mereka akan dipindahkan melalui refleksi sebagian besar kode akan dieksekusi lagi.
Selain itu, val
-properti tidak dapat dipindahkan setelah konstruktor dijalankan, sehingga ketidakmampuan juga hilang.
Jadi pertanyaannya adalah: bagaimana kode Kotlin dapat diadaptasi untuk bekerja dengan JPA tanpa duplikasi kode, memilih nilai awal "ajaib" dan kehilangan keabadian?
PS Benarkah Hibernate selain dari JPA dapat membangun objek tanpa konstruktor default?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- jadi, ya, Hibernate dapat berfungsi tanpa konstruktor default.