जेपीए की आवश्यकता के रूप में, @Entity
कक्षाओं में डेटाबेस से पुनर्प्राप्त करने के लिए ऑब्जेक्ट्स को तुरंत हटाने के लिए एक डिफ़ॉल्ट (गैर-आर्ग) निर्माता होना चाहिए।
कोटलिन में, गुणों को प्राथमिक निर्माता के भीतर घोषित करने के लिए बहुत सुविधाजनक है, निम्न उदाहरण में:
class Person(val name: String, val age: Int) { /* ... */ }
लेकिन जब गैर-अर्ग कंस्ट्रक्टर को द्वितीयक घोषित किया जाता है, तो उसे प्राथमिक कंस्ट्रक्टर को पारित करने के लिए मूल्यों की आवश्यकता होती है, इसलिए उनके लिए कुछ मान्य मान आवश्यक हैं, जैसे:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
मामले में गुण सिर्फ तुलना में कुछ अधिक जटिल प्रकार है जब String
और Int
विशेष रूप से जब प्राथमिक निर्माता और में ज्यादा कोड नहीं है यह पूरी तरह से उनके लिए मान प्रदान करने के लिए बुरा लग रहा है और वे गैर-व्यर्थ कर रहे हैं,, init
ब्लॉक और जब मापदंडों को सक्रिय रूप से उपयोग किया जाता है - - जब वे प्रतिबिंब के माध्यम से फिर से असाइन किए जाने वाले हों तो अधिकांश कोड को फिर से निष्पादित किया जाएगा।
इसके अलावा, val
-प्रोसेसर को निष्पादित करने के बाद -प्रकार नहीं दिया जा सकता है, इसलिए अपरिहार्यता भी खो जाती है।
तो सवाल यह है कि कोटलिन कोड को जेपीए के साथ काम करने के लिए बिना कोड डुप्लीकेशन के कैसे अनुकूलित किया जा सकता है, "जादू" प्रारंभिक मूल्यों और अपरिवर्तनीयता का नुकसान?
PS क्या यह सच है कि JPA से अलग हाइबरनेट कोई डिफ़ॉल्ट कंस्ट्रक्टर वाली वस्तुओं का निर्माण कर सकता है?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- तो, हां, हाइबरनेट डिफ़ॉल्ट कंस्ट्रक्टर के बिना काम कर सकता है।