4.1 इतिहासात भ्रमण

डेटाबेसमध्ये Java ऑब्जेक्ट्स सेव्ह करण्याचे काम जावा भाषा तयार झाल्यानंतर लगेचच संबंधित होते. त्या वेळी, जावा भाषेत फक्त एक डेटा प्रकार होता, तारीख, जो UNIX-वेळ मानकानुसार वेळ संग्रहित करतो: 1970 पासून मिलिसेकंदांची संख्या.

बरं, त्या वेळी डेटाबेसमध्ये तारखांसाठी आधीपासूनच भिन्न डेटा प्रकार होते, किमान तारीख, वेळ आणि तारीख + वेळ यासाठी वेगळे प्रकार होते:

  • DATE
  • TIME
  • टाइमस्टॅम्प

म्हणून, जावा भाषेच्या निर्मात्यांनी त्यात एक विशेष पॅकेज जोडले - java.sql, ज्यामध्ये वर्ग आहेत:

  • java.sql.date
  • java.sql.Time
  • java.sql.timestamp

या वर्गांचे मॅपिंग करणे खरोखर आनंददायक आहे:


@Entity
public class TemporalValues {
 
	@Basic
    private java.sql.Date sqlDate;
 
	@Basic
    private java.sql.Time sqlTime;
 
    @Basic
    private java.sql.Timestamp sqlTimestamp;
}

परंतु प्रोग्रामर वर्गासह काम करत असल्याने , हायबरनेटने तारीख प्रकाराचे मॅपिंग नियंत्रित करण्यासाठी java.util.Dateएक विशेष भाष्य जोडले .@Temporal

उदाहरण:

// If the annotation is missing, then the database will have a TIMESTAMP type
Date dateAsTimestamp;

@Temporal(TemporalType.DATE) // will be mapped to DATE type
Date dateAsDate;

@Temporal(TemporalType.TIME) // will be mapped to TIME type
Date dateAsTime;

प्रकार java.util.Calendarआणि java.util.Dateडीफॉल्ट प्रकार डेटाबेसमध्ये त्यांचे प्रतिनिधित्व करण्यासाठी TIMESTAMP प्रकार वापरतात.

4.2 नवीन वेळ

सध्या, मॅपिंगसह, सर्वकाही बरेच सोपे आणि चांगले आहे. सर्व डेटाबेस वेळेसह कार्य करण्यासाठी 4 प्रकारच्या डेटाला समर्थन देतात:

  • तारीख - तारीख: वर्ष, महिना आणि दिवस.
  • TIME - वेळ: तास, मिनिटे, सेकंद.
  • टाइमस्टँप - तारीख, वेळ आणि नॅनोसेकंद.
  • टाइम झोन सह टाइमस्टॅम्प - टाइमस्टँप आणि टाइम झोन (झोनचे नाव किंवा ऑफसेट).

प्रकार दर्शवण्यासाठी DATEjava.time.LocalDateJava मध्ये, तुम्हाला JDK 8 DateTime API मधील वर्ग वापरण्याची आवश्यकता आहे .

प्रकारTIMEडेटाबेसमधून Java मधून दोन प्रकारांनी दर्शविले जाऊ शकते: java.time.LocalTimeआणि java.time.OffsetTime. काहीही क्लिष्ट नाही.

आणि प्रकाराद्वारे दर्शविलेली अचूक तारीख आणि वेळटाइमस्टॅम्पबेसमध्ये, Java मध्ये ते 4 प्रकारांद्वारे दर्शविले जाऊ शकते:

  • java.time.त्वरित
  • java.time.LocalDateTime
  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

आणि शेवटीटाइम झोन सह टाइमस्टँपदोन प्रकारांनी दर्शविले जाऊ शकते:

  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

तुम्ही DateTime API शी आधीच परिचित असल्याने , ही बाब लक्षात ठेवणे तुमच्यासाठी कठीण होणार नाही :)

त्यांचे मॅपिंग करणे शुद्ध आनंद आहे:

@Basic
private java.time.LocalDate localDate;

@Basic
private java.time.LocalTime localTime;

@Basic
private java.time.OffsetTime offsetTime;

@Basic
private java.time.Instant instant;

@Basic
private java.time.LocalDateTime localDateTime;

@Basic
private java.time.OffsetDateTime offsetDateTime;

@Basic
private java.time.ZonedDateTime zonedDateTime;

भाष्याचा @Basicअर्थ असा की फील्डवर आपोआप प्रक्रिया केली जावी : हायबरनेट हे फील्ड कोणत्या कॉलममध्ये आणि टाइप करावयाचे हे ठरवेल.

4.3 टाइम झोनसह कार्य करणे

जर टाइम झोन तारखेचा भाग असेल, तर त्यांना डेटाबेसमध्ये संग्रहित करणे सोपे आहे - अगदी नियमित तारखेप्रमाणे:

@Basic
private java.time.OffsetDateTime offsetDateTime;

@Basic
private java.time.ZonedDateTime zonedDateTime;

तथापि, आपण तारखेपासून वेगळे टाइमझोन संचयित करू इच्छित असल्यास:

@Basic
private java.time.TimeZone timeZone;

@Basic
private java.time.ZoneOffset zonedOffset;

नंतर हायबरनेट ते डीफॉल्टनुसार VARCHAR प्रकारात संग्रहित करेल. जे, खरं तर, तार्किक आहे, कारण टाइमझोनमध्ये सहसा "UTC + 3" किंवा "कैरो" सारखे स्ट्रिंग नाव असते.

4.4 तुमचा स्वतःचा वेळ क्षेत्र सेट करणे

जेव्हा तुम्ही डेटाबेसमध्ये तारखा जतन करून काम करता तेव्हा तुमच्या लक्षात येईल की आधीच 4 ठिकाणे आहेत जिथे तुम्ही वर्तमान वेळ क्षेत्र सेट करू शकता:

  • सर्व्हर ऑपरेटिंग सिस्टम;
  • डीबीएमएस;
  • Java अनुप्रयोग
  • हायबरनेट.

DBMS ने टाइम झोन (TimeZone) निर्दिष्ट न केल्यास, ते ऑपरेटिंग सिस्टम सेटिंग्जमधून ते घेईल. हे गैरसोयीचे असू शकते, कारण बॅकअप DBMS सहसा इतर डेटा सेंटरमध्ये असतात ज्यांचे स्वतःचे टाइम झोन असते.

म्हणून, जवळजवळ सर्व DBMS प्रशासकांनी एकच झोन सेट केला आहे जेणेकरून डेटा एका सर्व्हरवरून दुसर्‍या सर्व्हरवर सहजपणे हस्तांतरित केला जाऊ शकतो.

Java ऍप्लिकेशनच्या बाबतीतही अशीच परिस्थिती आहे. हे वेगवेगळ्या डेटा सेंटर्समध्ये वेगवेगळ्या सर्व्हरवर देखील चालवले जाऊ शकते, म्हणून त्यात सामान्यतः एक स्पष्ट टाइम झोन असतो.


java -Duser.timezone=UTC ...

किंवा प्रोग्राम चालू असताना:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

आणि, अर्थातच, हायबरनेट तुम्हाला तुमचा टाइम झोन स्पष्टपणे सेट करण्याची परवानगी देतो.

प्रथम, सत्रफॅक्टरी कॉन्फिगर करताना ते निर्दिष्ट केले जाऊ शकते:

settings.put(
    AvailableSettings.JDBC_TIME_ZONE,
    TimeZone.getTimeZone("UTC")
);

दुसरे म्हणजे, वेळ क्षेत्र निर्दिष्ट केले जाऊ शकतेविशिष्ट सत्रासाठी:

Session session = sessionFactory()
    .withOptions()
    .jdbcTimeZone(TimeZone.getTimeZone("UTC"))
    .openSession();

4.5 @TimeZoneStorage भाष्य

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

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

उदाहरण:

@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "birthday_offset_offset")
@Column(name = "birthday_offset")
private OffsetDateTime offsetDateTimeColumn;

@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "birthday_zoned_offset")
@Column(name = "birthday_zoned")
private ZonedDateTime zonedDateTimeColumn;

ही कुबडी आहे. परंतु त्यासाठी एक निमित्त देखील आहे: हे अशा वेळी दिसून आले जेव्हा डेटटाइम API अद्याप अस्तित्वात नव्हते. आणि वर्गात TimeZone संग्रहित करणे अशक्य होते java.util.Date.

मला खरोखर आशा आहे की तुम्हाला तुमच्या कोडमध्ये हे सहसा दिसणार नाही.