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 String
e Int
nã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.