JPA'nın gerektirdiği gibi, @Entitysı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ı Stringve Intboş değer atanamaz olmaları durumunda, özellikle birincil oluşturucu ve initbloklarda ç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.