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

मागील तीन स्तरांदरम्यान, आम्हाला हायबरनेटशी थोडीशी ओळख झाली. दुसऱ्या फेरीची वेळ झाली आहे. आता आपण त्याच गोष्टीचा सखोल अभ्यास करू. आणि आपण डेटाबेसमधील टेबल्सच्या कॉलम्समध्ये Entity वर्गाच्या फील्ड्स मॅप करून सुरुवात करू.

तुम्हाला आधीच माहित आहे की, एंटिटी क्लासमधील फील्ड एका स्तंभावर मॅप करणे @Column भाष्य वापरून केले जाते . आणि आता प्रश्न आहे: अशा भाष्याने कोणत्या प्रकारचे फील्ड मॅप केले जाऊ शकतात?

Java मधील सर्व डेटा प्रकार तीन गटांमध्ये विभागले जाऊ शकतात:

  • हा प्रकार अगदी सोपा आणि डेटाबेसमध्ये संग्रहित करणे सोपे आहे .
  • प्रकार क्लिष्ट आहे आणि त्यासाठी तुम्हाला विशेष कन्व्हर्टर लिहावे लागेल .
  • प्रकार अतिशय गुंतागुंतीचा आहे आणि त्याची मूल्ये संग्रहित करण्यासाठी एका वेगळ्या सारणीची आवश्यकता आहे .

हायबरनेटला कसे संग्रहित करायचे हे माहित असलेले साधे प्रकार समाविष्ट आहेत:

जावा मध्ये प्रकार पॅकेज वर्ग उदाहरणे
आदिम जावा प्रकार बुलियन , इंट , डबल , इ.
आदिमानवांवर आवरण java.lang बुलियन , पूर्णांक , दुहेरी , इ.
तार java.lang स्ट्रिंग
"प्रगत" संख्या java.math BigInteger आणि BigDecimal
तारीख आणि वेळ java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , इन्स्टंट
विविध तारीख आणि वेळेत फरक java.util तारीख आणि कॅलेंडर
जुनी तारीख आणि वेळ स्वरूप java.sql तारीख , वेळ , टाइमस्टॅम्प
बाइट्स किंवा वर्णांचा अॅरे बाइट[] किंवा बाइट[] , चार[] किंवा वर्ण[]
एनम्स कोणताही enum
अनुक्रमे करण्यायोग्य वस्तू 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;
}

मॅन्युअल प्रकार असाइनमेंट - @Type भाष्य

काहीवेळा तुम्हाला हायबरनेटच्या पॉलिसीशी छेडछाड करायची असेल आणि डेटाबेसमध्ये कोणत्या प्रकारचा डेटा संग्रहित करायचा हे स्पष्टपणे सांगू शकता. उदाहरणार्थ, तुमच्‍या Entity वर्गात पूर्णांक प्रकाराचे फील्‍ड आहे, परंतु बेसमध्‍ये VARCHAR टाईप केलेला कॉलम आहे.

यासाठी एक खास भाष्य आहे - @Type . हे अगदी सोपे दिसते:

@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 हा प्रकार निर्दिष्ट केला आहे, String नाही . याचे कारण असे की आम्ही जावा भाषेद्वारे नव्हे तर DBMS द्वारे समर्थित प्रकारांपैकी एक निवडला आहे. त्या प्रत्येकाची स्वतःची प्रकारची प्रणाली आहे. हायबरनेट विकसकांनी या VARCHAR ऐवजी सोयीस्कर जावा-शैलीतील नावे आणली आहेत.

तसे, ही यादी इतकी लहान नाही. मी त्याचा काही भाग येथे देईन:

हायबरनेट प्रकार (org.hibernate.type पॅकेज) JDBC प्रकार जावा प्रकार बेसिकटाइपरेजिस्ट्री की(चे)
StringType वरचार java.lang.string स्ट्रिंग, java.lang.string
भौतिक क्लोब CLOB java.lang.string materialized_clob
TextType लांबवरचार java.lang.string मजकूर
वर्ण प्रकार CHAR char, java.lang.Caracter char, java.lang.Caracter
बुलियन प्रकार बिट बूलियन, java.lang.Boolian बूलियन, java.lang.Boolian
अंकीय बुलियन प्रकार पूर्णांक, 0 असत्य आहे, 1 सत्य आहे बूलियन, java.lang.Boolian अंकीय_बूलियन
होय नाही टाईप CHAR, 'N'/'n' असत्य आहे, 'Y'/'y' सत्य आहे. अप्परकेस व्हॅल्यू डेटाबेसवर लिहिली जाते. बूलियन, java.lang.Boolian होय नाही
TrueFalseType CHAR, 'F'/'f' असत्य आहे, 'T'/'t' सत्य आहे. अप्परकेस व्हॅल्यू डेटाबेसवर लिहिली जाते. बूलियन, java.lang.Boolian खरे खोटे
बाइट प्रकार TINYINT बाइट, java.lang.Byte बाइट, java.lang.Byte
लहान प्रकार SMALINT लहान, java.lang.Short लहान, java.lang.Short
पूर्णांक प्रकार पूर्णांक int, java.lang.Integer int, java.lang.Integer
लांब प्रकार BIGINT लांब, java.lang.Long लांब, java.lang.Long
फ्लोट प्रकार फ्लोट फ्लोट, java.lang.float फ्लोट, java.lang.float
दुहेरी प्रकार दुहेरी दुहेरी, java.lang.Double दुहेरी, java.lang.Double
BigIntegerType अंकीय java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType अंकीय java.math.BigDecimal big_decimal, java.math.bigDecimal
टाइमस्टॅम्प प्रकार टाइमस्टॅम्प java.sql.timestamp timestamp, java.sql.timestamp
वेळ प्रकार TIME java.sql.Time वेळ, java.sql.Time
तारीख प्रकार DATE java.sql.date तारीख, java.sql.date
कॅलेंडर प्रकार टाइमस्टॅम्प java.util.Calendar कॅलेंडर, java.util.Calendar
CalendarDateType DATE java.util.Calendar calendar_date
चलन प्रकार java.util.चलन वरचार चलन, java.util.Currency
LocaleType वरचार java.util.locale locale, java.utility.locale
टाइमझोन प्रकार VARCHAR, TimeZone ID वापरून java.util.TimeZone टाइमझोन, java.util.TimeZone
UrlType वरचार java.net.URL url, java.net.URL
वर्ग प्रकार VARCHAR(वर्ग FQN) java.lang.वर्ग वर्ग, java.lang.class

टेबल, अर्थातच, मोठे आहे, परंतु खूप उपयुक्त आहे. उदाहरणार्थ, यावरून हे स्पष्ट होते की बुलियन प्रकार किमान सहा वेगवेगळ्या प्रकारे डेटाबेसमध्ये संग्रहित केला जाऊ शकतो. तुला एवढी गरज नाही का? आणि कोण म्हणाले की आपण बचत करण्याचा मार्ग निवडा?

SQL मध्ये बूलियन प्रकार नाही आणि तो अनेकदा याप्रमाणे संग्रहित केला जातो:

  • 1 किंवा 0
  • 'एफ' किंवा 'टी'
  • 'Y' किंवा 'N'

म्हणून, जेव्हा हायबरनेटला हे सर्व त्रास समजतात तेव्हा ते खूप चांगले असते. किंवा, उदाहरणार्थ, डेटाबेसमधील डेटा अॅरेचे संचयन घेऊ. तेथे विविध पर्यायांचा समूह आहे आणि हायबरनेटला त्या सर्वांसह कसे कार्य करावे हे माहित आहे:

हायबरनेट प्रकार (org.hibernate.type पॅकेज) JDBC प्रकार जावा प्रकार बेसिक टाइपरजिस्ट्र
ब्लॉब प्रकार BLOB java.sql.blob ब्लॉग, java.sql.blob
क्लॉब प्रकार CLOB java.sql.clob clob, java.sql.clob
बायनरी प्रकार वार्बिनरी बाइट[] बायनरी, बाइट[]
मटेरियलाइज्ड ब्लॉबटाइप BLOB बाइट[] materized_blob
प्रतिमा प्रकार लाँगवर्बिनरी बाइट[] प्रतिमा
रॅपरबायनरी प्रकार वार्बिनरी java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType वरचार चार[] वर्ण, वर्ण[]
CharacterArrayType वरचार java.lang.Caracter[] आवरण-वर्ण, वर्ण[], java.lang.Caracter[]
UUIDBinaryType बायनरी java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, VARCHAR देखील वाचू शकतो java.util.UUID uuid-char
PostgreSQLUUIDT प्रकार PostgreSQL UUID, प्रकार #OTHER द्वारे, जे PostgreSQL JDBC ड्रायव्हर व्याख्येचे पालन करते java.util.UUID pg-uuid
आणि JDK 8 रिलीज झाल्यापासून, हायबरनेटने काही अधिक वेळ-संबंधित प्रकार जोडले आहेत. आपले जीवन सोपे करण्यासाठी सर्व. या सर्व नवीन फॅन्गल्ड प्रकार समर्थित आहेत की नाही याबद्दल आता तुम्हाला आश्चर्य वाटण्याची गरज नाही. हायबरनेटच्या निर्मात्यांनी आधीच तुमच्यासाठी त्यांचे समर्थन जोडले आहे:
हायबरनेट प्रकार (org.hibernate.type पॅकेज) JDBC प्रकार जावा प्रकार बेसिक टाइपरजिस्ट्र
कालावधी प्रकार BIGINT java.वेळ.कालावधी कालावधी, जावा.वेळ.कालावधी
झटपट प्रकार टाइमस्टॅम्प java.time.त्वरित झटपट, java.time.Instant
LocalDateTimeType टाइमस्टॅम्प java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATE java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TIME java.time.LocalTime LocalTime, java.time.LocalTime
ऑफसेटDateTimeType टाइमस्टॅम्प java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
ऑफसेटटाइम प्रकार TIME java.time.OffsetTime ऑफसेटटाइम, java.time.OffsetTime
ऑफसेटटाइम प्रकार टाइमस्टॅम्प java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime