4.1 చరిత్రలో విహారం

జావా ఆబ్జెక్ట్‌లను డేటాబేస్‌లో సేవ్ చేసే పని జావా భాష సృష్టించిన వెంటనే సంబంధితంగా ఉంటుంది. ఆ సమయంలో, జావా భాషలో ఒకే ఒక డేటా రకం ఉంది, తేదీ, ఇది 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 రకాల డేటాకు మద్దతు ఇస్తాయి:

  • DATE - తేదీ: సంవత్సరం, నెల మరియు రోజు.
  • TIME - సమయం: గంటలు, నిమిషాలు, సెకన్లు.
  • TIMESTAMP - తేదీ, సమయం మరియు నానోసెకన్లు.
  • టైమ్‌స్టాంప్‌తో టైమ్ జోన్ - టైమ్‌స్టాంప్ మరియు టైమ్ జోన్ (జోన్ పేరు లేదా ఆఫ్‌సెట్).

రకాన్ని సూచించడానికి DATEjava.time.LocalDateజావాలో, మీరు JDK 8 DateTime API నుండి ఒక తరగతిని ఉపయోగించాలి .

టైప్ చేయండిTIMEడేటాబేస్ నుండి జావా నుండి రెండు రకాలుగా సూచించవచ్చు: 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 సమయ మండలిని (టైమ్‌జోన్) పేర్కొనకపోతే, అది ఆపరేటింగ్ సిస్టమ్ సెట్టింగ్‌ల నుండి దాన్ని తీసుకుంటుంది. బ్యాకప్ 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 ఇంకా ఉనికిలో లేని సమయంలో కనిపించింది. మరియు టైమ్‌జోన్‌ని తరగతిలో నిల్వ చేయడం అసాధ్యం java.util.Date.

మీ కోడ్‌లో మీరు దీన్ని తరచుగా చూడరని నేను నిజంగా ఆశిస్తున్నాను.