Conforme a JPA exige, @Entity classes devem ter um construtor padrão (não arg) para instanciar os objetos ao recuperá-los do banco de dados.
No Kotlin, é muito conveniente declarar propriedades no construtor principal, como no exemplo a seguir:
class Person(val name: String, val age: Int) { /* ... */ }
Mas quando o construtor não-arg é declarado como secundário, ele exige que valores sejam passados para o construtor primário, portanto, alguns valores válidos são necessários para eles, como aqui:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Caso as propriedades tenham um tipo mais complexo do que apenas Stringe Intnão sejam anuláveis, será totalmente ruim fornecer os valores para elas, especialmente quando houver muito código no construtor primário einit blocos principais e quando os parâmetros forem usados ativamente - - quando eles serão reatribuídos por reflexão, a maior parte do código será executada novamente.
Além disso, val-properties não pode ser reatribuído após a execução do construtor, portanto a imutabilidade também é perdida.
Portanto, a pergunta é: como o código Kotlin pode ser adaptado para funcionar com o JPA sem duplicação de código, escolhendo valores iniciais "mágicos" e perda de imutabilidade?
PS É verdade que o Hibernate, além do JPA, pode construir objetos sem construtor padrão?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)- então, sim, o Hibernate pode funcionar sem o construtor padrão.