समर्थित डेटा प्रकार

पिछले तीन स्तरों के दौरान, हम हाइबरनेट से थोड़ा परिचित हुए। यह दूसरे दौर का समय है। अब हम उसी बात का अध्ययन करना शुरू करेंगे, केवल गहराई से। और हम Entity क्लास के फील्ड को डेटाबेस में टेबल के कॉलम में मैप करके शुरू करेंगे।

जैसा कि आप पहले से ही जानते हैं, एक एंटिटी क्लास में एक फील्ड को एक कॉलम में मैप करने के लिए @ कॉलम एनोटेशन का उपयोग किया जाता है । और अब सवाल यह है कि इस तरह के एनोटेशन के साथ किस प्रकार के फ़ील्ड्स को मैप किया जा सकता है?

जावा में सभी डेटा प्रकारों को तीन समूहों में विभाजित किया जा सकता है:

  • डेटाबेस में स्टोर करने के लिए प्रकार काफी सरल और आसान है ।
  • प्रकार जटिल है और आपको इसके लिए एक विशेष कनवर्टर लिखने की आवश्यकता है ।
  • प्रकार बहुत जटिल है और इसके मूल्यों को संग्रहीत करने के लिए एक अलग तालिका की आवश्यकता है

हाइबरनेट को स्टोर करने का तरीका जानने वाले सरल प्रकारों में शामिल हैं:

जावा में प्रकार पैकेट कक्षा के उदाहरण
आदिम जावा प्रकार बूलियन , इंट , डबल , आदि।
प्रिमिटिव पर रैपर java.lang बूलियन , पूर्णांक , डबल , आदि।
स्ट्रिंग्स java.lang डोरी
"उन्नत" नंबर java.math बिगइंटीजर और बिगडिसीमल
तिथि और समय java.time स्थानीय दिनांक , स्थानीय समय , स्थानीय दिनांक समय , ऑफ़सेट समय , ऑफ़सेट दिनांक समय , झटपट
विभिन्न दिनांक और समय विविधताएं java.util दिनांक और कैलेंडर
पुरानी तारीख और समय प्रारूप java.sql दिनांक , समय , टाइमस्टैम्प
बाइट्स या वर्णों का ऐरे बाइट [] या बाइट [] , चार [] या कैरेक्टर []
Enums कोई भी एनम
सीरियल करने योग्य वस्तुएं Java.io.Serializable का कोई कार्यान्वयन

इन सभी प्रकारों के SQL भाषा में उनके समकक्ष हैं, इसलिए हाइबरनेट जानता है कि उन्हें डेटाबेस से कैसे स्टोर और लोड करना है।

उदाहरण:

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="level")
   public Integer level;

   @Column(name="created_date")
   public Date createdDate;
}

मैनुअल टाइप असाइनमेंट - @टाइप एनोटेशन

कभी-कभी आप हाइबरनेट की नीति के साथ छेड़छाड़ करना चाह सकते हैं और स्पष्ट रूप से बता सकते हैं कि डेटाबेस में किस प्रकार का डेटा स्टोर करना है। उदाहरण के लिए, आपके पास इंटीजर प्रकार की इकाई वर्ग में एक फ़ील्ड है, लेकिन आधार में इसके लिए VARCHAR प्रकार के साथ एक कॉलम है।

इसके लिए एक विशेष एनोटेशन है - @ टाइप । यह बहुत ही सरल दिखता है:

@Type(type="type-name")

आइए, उदाहरण के लिए, हाइबरनेट को फ़ील्ड बनाने के लिए कहेंसृजित दिनांकहमारे उपयोगकर्ता वर्ग को डेटाबेस में एक स्ट्रिंग के रूप में संग्रहीत किया गया था:

@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;

   @Column(name="created_date")
   @Type(type="org.hibernate.type.StringType")
    public Date createdDate;
}

यदि हाइबरनेट ने दिनांक प्रकार को अपने नए प्रकार में परिवर्तित करने का तरीका निकाला है, तो यह बस ऐसा करेगा। यदि यह समझ में नहीं आता है, तो आपको एक विशेष प्रकार के कनवर्टर को निर्दिष्ट करने की आवश्यकता होगी। लेकिन उस पर बाद में।

डेटाबेस के लिए हाइबरनेट प्रकारों की सूची

वैसे, क्या आपने ध्यान दिया कि हमने org.hibernate.type.StringType प्रकार निर्दिष्ट किया है, स्ट्रिंग नहीं । ऐसा इसलिए है क्योंकि हमने डीबीएमएस द्वारा समर्थित प्रकारों में से एक को चुना है न कि जावा भाषा द्वारा। उनमें से प्रत्येक की अपनी प्रकार प्रणाली है। यह सिर्फ इतना है कि हाइबरनेट डेवलपर्स इन VARCHARs के बजाय सुविधाजनक जावा-शैली के नाम लेकर आए।

वैसे यह लिस्ट इतनी छोटी नहीं है। मैं इसका एक हिस्सा यहाँ दूंगा:

हाइबरनेट प्रकार (org.hibernate.type पैकेज) जेडीबीसी प्रकार जावा प्रकार बेसिक टाइप रजिस्ट्री कुंजी
स्ट्रिंग टाइप वरचर java.lang.string स्ट्रिंग, java.lang.string
भौतिक कल्ब सीएलओबी java.lang.string materialized_clob
पाठ्य प्रकार लोंगवरचर java.lang.string मूलपाठ
चरित्र प्रकार चार चार, java.lang.Character चार, java.lang.Character
बूलियन प्रकार अंश बूलियन, java.lang.Boolean बूलियन, java.lang.Boolean
न्यूमेरिक बूलियन टाइप पूर्णांक, 0 असत्य है, 1 सत्य है बूलियन, java.lang.Boolean numer_boolean
हाँ नहीं प्रकार चार, 'एन'/'एन' झूठा है, 'वाई'/'वाई' सच है। अपरकेस मान डेटाबेस को लिखा जाता है। बूलियन, java.lang.Boolean हां नहीं
TrueFalseType चार, 'एफ'/'एफ' झूठा है, 'टी'/'टी' सच है। अपरकेस मान डेटाबेस को लिखा जाता है। बूलियन, java.lang.Boolean सही गलत
बाइट टाइप टिनयिंट बाइट, java.lang.Byte बाइट, java.lang.Byte
लघु प्रकार छोटा छोटा, java.lang.Short छोटा, java.lang.Short
पूर्णांक प्रकार पूर्णांक int, java.lang.Integer int, java.lang.Integer
लंबा प्रकार बिगिनट लंबा, java.lang.Long लंबा, java.lang.Long
फ्लोट प्रकार तैरना फ्लोट, java.lang.Float फ्लोट, java.lang.Float
डबल प्रकार दोहरा डबल, java.lang.Double डबल, java.lang.Double
बिगइंटीजर टाइप संख्यात्मक java.math.BigInteger big_integer, java.math.BigInteger
बिगडेसिमल टाइप संख्यात्मक java.math.BigDecimal big_decimal, java.math.bigDecimal
टाइमस्टैम्प प्रकार TIMESTAMP java.sql.timestamp टाइमस्टैम्प, java.sql.timestamp
समय प्रकार समय java.sql.समय समय, java.sql.समय
दिनांक प्रकार तारीख java.sql.date दिनांक, java.sql.date
कैलेंडर प्रकार TIMESTAMP java.util.Calendar कैलेंडर, java.util.Calendar
कैलेंडर दिनांक प्रकार तारीख java.util.Calendar कैलेंडर_तारीख
मुद्रा प्रकार java.util.Currency वरचर मुद्रा, java.util.Currency
स्थान प्रकार वरचर java.util.locale स्थान, java.utility.locale
समय क्षेत्र प्रकार VARCHAR, TimeZone ID का उपयोग करते हुए java.util.TimeZone समयक्षेत्र, java.util.TimeZone
यूआरएल प्रकार वरचर java.net.URL यूआरएल, java.net.URL
वर्ग प्रकार वचरर (कक्षा एफक्यूएन) java.lang.Class वर्ग, java.lang.Class

तालिका, ज़ाहिर है, बड़ी है, लेकिन बहुत उपयोगी है। उदाहरण के लिए, इससे यह स्पष्ट है कि बूलियन प्रकार को डेटाबेस में कम से कम छह अलग-अलग तरीकों से संग्रहीत किया जा सकता है। क्या आपको इतना नहीं चाहिए? और किसने कहा कि आप बचाने का रास्ता चुनते हैं?

SQL में कोई बूलियन प्रकार नहीं है और इसे अक्सर इस तरह संग्रहीत किया जाता है:

  • 1 या 0
  • 'एफ' या 'टी'
  • 'वाई' या 'एन'

इसलिए, यह बहुत अच्छा है जब हाइबरनेट इन सभी परेशानियों को समझता है। या, उदाहरण के लिए, डेटाबेस में डेटा सरणियों का भंडारण करते हैं। विभिन्न विकल्पों का एक समूह है, और हाइबरनेट जानता है कि उन सभी के साथ कैसे काम करना है:

हाइबरनेट प्रकार (org.hibernate.type पैकेज) जेडीबीसी प्रकार जावा प्रकार बेसिकटाइपरजिस्टर
बूँद प्रकार ब्लॉब java.sql.blob ब्लॉग, java.sql.blob
clobtype सीएलओबी java.sql.clob क्लोब, java.sql.clob
बाइनरी टाइप वर्बिनरी बाइट[] बाइनरी, बाइट []
मटेरियलाइज्डब्लॉब टाइप ब्लॉब बाइट[] materized_blob
छवि प्रकार लोंगवर्बिनरी बाइट[] छवि
रैपरबाइनरी टाइप वर्बिनरी java.lang.बाइट [] रैपर-बाइनरी, बाइट [], java.lang.बाइट []
चारअरे टाइप वरचर चार [] अक्षर, चार []
कैरेक्टरएरे टाइप वरचर java.lang.Character[] आवरण-अक्षर, चरित्र [], java.lang.Character[]
यूयूआईडीबाइनरी टाइप बायनरी java.util.UUID यूयूआईडी-बाइनरी, java.util.UUID
UUIDcharType CHAR, VARCHAR भी पढ़ सकता है java.util.UUID uuid-char
पोस्टग्रेएसक्यूएलयूयूआईडीटाइप PostgreSQL UUID, थ्रू Types#OTHER, जो PostgreSQL JDBC ड्राइवर परिभाषा का अनुपालन करता है java.util.UUID pg-uuid
और JDK 8 के रिलीज़ होने के बाद से, हाइबरनेट ने कुछ और समय-संबंधित प्रकार जोड़े हैं। सब आपके जीवन को आसान बनाने के लिए। अब आपको आश्चर्य करने की ज़रूरत नहीं है कि ये सभी नए प्रकार समर्थित हैं या नहीं। हाइबरनेट के निर्माता आपके लिए पहले ही अपना समर्थन जोड़ चुके हैं:
हाइबरनेट प्रकार (org.hibernate.type पैकेज) जेडीबीसी प्रकार जावा प्रकार बेसिकटाइपरजिस्टर
अवधि प्रकार बिगिनट java.time.Duration अवधि, java.time.Duration
तत्काल प्रकार TIMESTAMP java.time.Instant झटपट, java.time.Instant
स्थानीय दिनांक समय प्रकार TIMESTAMP java.time.LocalDateTime लोकलडेटटाइम, जावा.टाइम.लोकलडेटटाइम
स्थानीय दिनांक प्रकार तारीख java.time.LocalDate लोकलडेट, जावा.टाइम.लोकलडेट
स्थानीय समय प्रकार समय java.time.LocalTime लोकलटाइम, जावा.टाइम.लोकलटाइम
ऑफसेट दिनांक समय प्रकार TIMESTAMP java.time.OffsetDateTime ऑफ़सेटडेटटाइम, java.time.OffsetDateTime
ऑफ़सेट टाइम टाइप समय java.time.OffsetTime ऑफ़सेटटाइम, java.time.OffsetTime
ऑफ़सेट टाइम टाइप TIMESTAMP java.time.ZonedDateTime ज़ोनडडेटटाइम, जावा.टाइम.ज़ोनडडेटटाइम