Như JPA yêu cầu, @Entity
các lớp nên có một hàm tạo mặc định (không đối số) để khởi tạo các đối tượng khi lấy chúng từ cơ sở dữ liệu.
Trong Kotlin, các thuộc tính rất thuận tiện để khai báo bên trong hàm tạo chính, như trong ví dụ sau:
class Person(val name: String, val age: Int) { /* ... */ }
Nhưng khi hàm tạo không đối số được khai báo là hàm thứ cấp, nó yêu cầu các giá trị cho hàm tạo chính được truyền vào, vì vậy một số giá trị hợp lệ là cần thiết cho chúng, như ở đây:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Trong trường hợp khi các thuộc tính có một số loại phức tạp hơn chỉ String
và Int
chúng không thể rỗng, thì việc cung cấp các giá trị cho chúng là rất tệ, đặc biệt là khi có nhiều mã trong hàm tạo và init
khối chính và khi các tham số được sử dụng tích cực - - khi chúng được gán lại thông qua sự phản chiếu, hầu hết các mã sẽ được thực thi lại.
Hơn nữa, các sản val
phẩm không thể được chỉ định lại sau khi hàm tạo thực thi, do đó tính bất biến cũng bị mất.
Vì vậy, câu hỏi là: làm thế nào mã Kotlin có thể được điều chỉnh để hoạt động với JPA mà không cần sao chép mã, chọn giá trị ban đầu "ma thuật" và mất tính bất biến?
PS Có đúng là Hibernate ngoài JPA có thể xây dựng các đối tượng không có hàm tạo mặc định không?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- vì vậy, vâng, Hibernate có thể hoạt động mà không cần hàm tạo mặc định.