ตามที่ JPA ต้องการ@Entity
คลาสควรมีคอนสตรัคเตอร์เริ่มต้น (ไม่ใช่อาร์กิวเมนต์) เพื่อสร้างอินสแตนซ์อ็อบเจ็กต์เมื่อดึงข้อมูลจากฐานข้อมูล
ใน Kotlin คุณสมบัติสะดวกมากที่จะประกาศภายในตัวสร้างหลักดังตัวอย่างต่อไปนี้:
class Person(val name: String, val age: Int) { /* ... */ }
แต่เมื่อคอนสตรัคเตอร์ที่ไม่ใช่อาร์กิวเมนต์ถูกประกาศเป็นตัวสร้างรองจะต้องมีการส่งผ่านค่าสำหรับตัวสร้างหลักดังนั้นจึงจำเป็นต้องมีค่าที่ถูกต้องสำหรับพวกเขาเช่นที่นี่:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
ในกรณีที่คุณสมบัติมีบางประเภทที่ซับซ้อนมากกว่า just String
และInt
และไม่เป็นโมฆะมันดูไม่ดีเลยที่จะระบุค่าสำหรับพวกเขาโดยเฉพาะอย่างยิ่งเมื่อมีโค้ดจำนวนมากในตัวสร้างและinit
บล็อกหลักและเมื่อมีการใช้พารามิเตอร์ - - เมื่อพวกเขาจะถูกกำหนดใหม่โดยการสะท้อนรหัสส่วนใหญ่จะถูกเรียกใช้งานอีกครั้ง
ยิ่งไปกว่านั้นval
-properties ไม่สามารถกำหนดใหม่ได้หลังจากตัวสร้างดำเนินการดังนั้นความไม่เปลี่ยนรูปจึงหายไปด้วย
คำถามคือ: โค้ด Kotlin สามารถปรับให้เข้ากับ JPA ได้อย่างไรโดยไม่ต้องทำซ้ำรหัสโดยเลือกค่าเริ่มต้น "magic" และการสูญเสียความไม่เปลี่ยนรูป
ปล. เป็นความจริงหรือไม่ที่ Hibernate นอกเหนือจาก JPA สามารถสร้างวัตถุโดยไม่มีตัวสร้างเริ่มต้นได้?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- ใช่แล้ว Hibernate สามารถทำงานได้โดยไม่มีตัวสร้างเริ่มต้น