JPA에서 요구하는대로 @Entity
클래스는 데이터베이스에서 객체를 검색 할 때 객체를 인스턴스화 할 기본 (비 인수) 생성자를 가져야합니다.
Kotlin에서는 다음 예제와 같이 기본 생성자 내에서 속성을 선언하는 것이 매우 편리합니다.
class Person(val name: String, val age: Int) { /* ... */ }
그러나 인수가 아닌 생성자를 보조 생성자로 선언하면 기본 생성자에 대한 값이 전달되어야하므로 다음과 같이 유효한 값이 필요합니다.
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
경우 속성은보다 좀 더 복잡한 유형이있을 때 String
와 Int
특히 주 생성자에서 많은 코드있을 때, 그들에 대한 값을 제공하는 완전히 나쁜 보이는, 그들은 Null이있어 init
블록 매개 변수가 적극적으로 사용된다 - -리플렉션을 통해 재 할당 될 때 대부분의 코드가 다시 실행됩니다.
또한 val
생성자가 실행 된 후 -properties를 재 지정할 수 없으므로 불변성도 손실됩니다.
문제는 어떻게 코드 중복없이 Kotlin 코드를 JPA와 함께 사용하여 "마법의"초기 값과 불변성의 손실을 선택할 수 있습니까?
추신 JPA를 제외하고 Hibernate는 기본 생성자없이 객체를 생성 할 수 있다는 것이 사실입니까?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
– 예, Hibernate는 기본 생성자없이 작동 할 수 있습니다.