4.1 வரலாற்றில் பயணம்

ஜாவா பொருட்களை தரவுத்தளத்தில் சேமிக்கும் பணி ஜாவா மொழியை உருவாக்கிய உடனேயே பொருத்தமானது. அந்த நேரத்தில், ஜாவா மொழியில் ஒரே ஒரு தரவு வகை மட்டுமே இருந்தது, தேதி, இது UNIX-நேர தரநிலையின்படி நேரத்தைச் சேமித்தது: 1970 முதல் மில்லி விநாடிகளின் எண்ணிக்கை.

சரி, அந்த நேரத்தில் தரவுத்தளங்களில் ஏற்கனவே தேதிகளுக்கு வெவ்வேறு தரவு வகைகள் இருந்தன, குறைந்தபட்சம் தேதி, நேரம் மற்றும் தேதி + நேரத்திற்கான தனி வகைகள் இருந்தன:

  • DATE
  • நேரம்
  • நேர முத்திரை

எனவே, ஜாவா மொழியை உருவாக்கியவர்கள் அதில் ஒரு சிறப்பு தொகுப்பைச் சேர்த்துள்ளனர் - 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 - நேரம்: மணிநேரம், நிமிடங்கள், வினாடிகள்.
  • TIMESTAMP - தேதி, நேரம் மற்றும் நானோ விநாடிகள்.
  • நேர மண்டலத்துடன் கூடிய டைம்ஸ்டாம்ப் - டைம்ஸ்டாம்ப் மற்றும் நேர மண்டலம் (மண்டலத்தின் பெயர் அல்லது ஆஃப்செட்).

வகையைக் குறிக்க DATEஜாவாவில், நீங்கள் java.time.LocalDateJDK 8 DateTime API இலிருந்து ஒரு வகுப்பைப் பயன்படுத்த வேண்டும்.

வகைநேரம்தரவுத்தளத்திலிருந்து ஜாவாவிலிருந்து இரண்டு வகைகளால் குறிப்பிடப்படலாம்: java.time.LocalTimeமற்றும் java.time.OffsetTime. சிக்கலான எதுவும் இல்லை.

மற்றும் வகையால் குறிப்பிடப்படும் சரியான தேதி மற்றும் நேரம்நேர முத்திரைஅடித்தளத்தில், ஜாவாவில் இது 4 வகைகளால் குறிக்கப்படுகிறது:

  • java.time.Instant
  • 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 இடங்கள் உள்ளன என்பதை நீங்கள் காண்பீர்கள்:

  • சேவையக இயக்க முறைமை;
  • DBMS;
  • ஜாவா பயன்பாடு
  • உறக்கநிலை.

DBMS ஒரு நேர மண்டலத்தை (TimeZone) குறிப்பிடவில்லை என்றால், அது இயக்க முறைமை அமைப்புகளில் இருந்து எடுக்கும். காப்புப்பிரதி DBMSகள் பெரும்பாலும் அவற்றின் சொந்த நேர மண்டலத்தைக் கொண்ட பிற தரவு மையங்களில் அமைந்துள்ளதால், இது சிரமமாக இருக்கும்.

எனவே, கிட்டத்தட்ட அனைத்து DBMS நிர்வாகிகளும் ஒரு மண்டலத்தை அமைக்கிறார்கள், இதனால் தரவு ஒரு சேவையகத்திலிருந்து மற்றொரு சேவையகத்திற்கு எளிதாக மாற்றப்படும்.

ஜாவா பயன்பாட்டிலும் இதே நிலைதான். இது வெவ்வேறு தரவு மையங்களில் உள்ள வெவ்வேறு சேவையகங்களிலும் இயக்கப்படலாம், எனவே இது பொதுவாக வெளிப்படையான நேர மண்டலத்தைக் கொண்டுள்ளது.


java -Duser.timezone=UTC ...

அல்லது நிரல் இயங்கும் போது:

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

மற்றும், நிச்சயமாக, ஹைபர்னேட் உங்கள் நேர மண்டலத்தை வெளிப்படையாக அமைக்க அனுமதிக்கிறது.

முதலில், SessionFactory ஐ உள்ளமைக்கும்போது அதைக் குறிப்பிடலாம்:

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;

இது ஒரு ஊன்றுகோல். ஆனால் அதற்கு ஒரு தவிர்க்கவும் உள்ளது: இது DateTime API இன்னும் இல்லாத நேரத்தில் தோன்றியது. மேலும் வகுப்பில் TimeZone ஐ சேமிக்க இயலாது java.util.Date.

உங்கள் குறியீட்டில் இதை நீங்கள் அடிக்கடி பார்க்க மாட்டீர்கள் என்று நம்புகிறேன்.