JPA'nın gerektirdiği gibi, @Entity
sınıflar, nesneleri veritabanından alırken örneklemek için varsayılan (arg olmayan) bir yapıcıya sahip olmalıdır.
Kotlin'de, aşağıdaki örnekte olduğu gibi, özellikler birincil kurucu içinde bildirilmek için çok uygundur:
class Person(val name: String, val age: Int) { /* ... */ }
Ancak arg olmayan yapıcı ikincil olarak bildirildiğinde, birincil kurucunun değerlerinin aktarılmasını gerektirir, bu nedenle bunlar için bazı geçerli değerler gereklidir, örneğin burada:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Özelliklerin yalnızca daha karmaşık bir türe sahip olması String
ve Int
boş değer atanamaz olmaları durumunda, özellikle birincil oluşturucu ve init
bloklarda çok fazla kod olduğunda ve parametreler aktif olarak kullanıldığında , bunlar için değerleri sağlamak tamamen kötü görünür - - yansıtma yoluyla yeniden atandıklarında, kodun çoğu tekrar çalıştırılacaktır.
Dahası, val
-özellikler, kurucu çalıştırıldıktan sonra yeniden atanamaz, dolayısıyla değişmezlik de kaybolur.
Öyleyse soru şu: Kotlin kodu, kod kopyası olmadan, "sihirli" başlangıç değerleri seçilerek ve değişmezlik kaybı olmadan JPA ile çalışmak üzere nasıl uyarlanabilir?
Not: JPA dışında Hibernate'in varsayılan kurucu olmadan nesneler oluşturabileceği doğru mu?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- evet, Hibernate varsayılan kurucu olmadan çalışabilir.