समर्थित डेटा प्रकार
पिछले तीन स्तरों के दौरान, हम हाइबरनेट से थोड़ा परिचित हुए। यह दूसरे दौर का समय है। अब हम उसी बात का अध्ययन करना शुरू करेंगे, केवल गहराई से। और हम 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 |
हाइबरनेट प्रकार (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 | ज़ोनडडेटटाइम, जावा.टाइम.ज़ोनडडेटटाइम |
GO TO FULL VERSION