การใช้คำอธิบายประกอบ @Temporal ในไฮเบอร์เนตคืออะไร?


104

เอกสาร Hibernate มีข้อมูลด้านล่างสำหรับ@Temporalคำอธิบายประกอบ:

ใน Java API ธรรมดาไม่ได้กำหนดความแม่นยำของเวลาชั่วคราว เมื่อจัดการกับข้อมูลชั่วคราวคุณอาจต้องการอธิบายความแม่นยำที่คาดหวังในฐานข้อมูล ข้อมูลช่วงเวลาสามารถมีความแม่นยำ DATE, TIME หรือ TIMESTAMP (เช่นวันที่จริงเฉพาะเวลาหรือทั้งสองอย่าง) ใช้คำอธิบายประกอบ @Temporal เพื่อปรับแต่งสิ่งนั้น

อะไรtemporal precision of time is not definedหมายถึง? อะไรคือtemporalข้อมูลและความแม่นยำของตนหรือไม่ มันปรับยังไง?


3
หากคุณใช้ปฏิทินเป็นคุณสมบัติเอนทิตีของคุณใน java ธรรมดามันจะพิมพ์ข้อมูลจำนวนมากซึ่งไม่จำเป็นเมื่อคุณต้องการบันทึกลงในฐานข้อมูลเป็นต้นในกรณีนั้นคุณสามารถมีบางอย่างเช่น @Temporal (TemporalType.TIMESTAMP) ปฏิทินปฏิทินในเอนทิตีของคุณเพื่อจัดเก็บการประทับเวลาไปยังฐานข้อมูลของคุณหรือเพียงแค่วันที่หรือเพียงเวลาโดยเปลี่ยนเป็น @Temporal (TemporalType.DATE) หรือ @Temporal (TemporalType.TIME) ในคุณสมบัติปฏิทินของคุณ
user3487063

คำตอบ:


107

ต้องระบุคำอธิบายประกอบนี้สำหรับเขตข้อมูลหรือคุณสมบัติของชนิดjava.util.Dateและjava.util.Calendarและอาจระบุเฉพาะสำหรับเขตข้อมูลหรือคุณสมบัติของประเภทเหล่านี้

Temporalคำอธิบายประกอบอาจถูกนำมาใช้ร่วมกับBasicคำอธิบายประกอบการIdบันทึกย่อหรือElementCollectionคำอธิบายประกอบ (เมื่อค่าคอลเลกชันองค์ประกอบเป็นเช่นประเภทชั่วคราว

ใน Java API ธรรมดาไม่ได้กำหนดความแม่นยำของเวลาชั่วคราว เมื่อจัดการกับข้อมูลชั่วคราวคุณอาจต้องการอธิบายความแม่นยำที่คาดหวังในฐานข้อมูล ข้อมูลช่วงเวลาอาจมีความแม่นยำ DATE, TIME หรือ TIMESTAMP (เช่นวันที่จริงเฉพาะเวลาหรือทั้งสองอย่าง) ใช้@Temporalคำอธิบายประกอบเพื่อปรับแต่งสิ่งนั้น

ข้อมูลชั่วคราวคือข้อมูลที่เกี่ยวข้องกับเวลา ตัวอย่างเช่นในระบบจัดการเนื้อหาวันที่สร้างและวันที่อัปเดตล่าสุดของบทความเป็นข้อมูลชั่วคราว ในบางกรณีข้อมูลชั่วคราวต้องการความแม่นยำและคุณต้องการจัดเก็บวันที่ / เวลาที่แม่นยำหรือทั้งสองอย่าง (TIMESTAMP ) ในตารางฐานข้อมูล

ไม่ได้ระบุความแม่นยำชั่วคราวใน Java API หลัก @Temporalเป็นคำอธิบายประกอบที่แปลงกลับไปมาระหว่างการประทับเวลาและJPA java.util.Dateนอกจากนี้ยังแปลงtime-stampเป็นเวลา ยกตัวอย่างเช่นในตัวอย่างด้านล่างลดลงตามระยะเวลาและมีเพียงวันที่จะเก็บรักษา@Temporal(TemporalType.DATE)

@Temporal(TemporalType.DATE)
private java.util.Date creationDate;

ตาม Javadocs

คำอธิบายประกอบเพื่อประกาศ {@code TemporalType} ที่เหมาะสมในพารามิเตอร์วิธีการสืบค้น โปรดทราบว่าคำอธิบายประกอบนี้สามารถใช้ได้เฉพาะกับพารามิเตอร์ประเภท {@link Date} ที่เป็นค่าเริ่มต้นTemporalType.DATE

[ข้อมูลข้างต้นรวบรวมจากแหล่งต่างๆ]


เหตุใดจึงใช้กับ Timestamp ประเภท Java ไม่ได้
powder366

3
ดังนั้นหากคุณเพิ่งใช้ TemporalType.TIMESTAMP ... มีจุดใดที่จะใช้คำอธิบายประกอบนี้หรือไม่? วันที่ดูเหมือนจะทำงานได้ดีหากไม่มีมัน ..
Amalgovinus

ฉันจะจัดเก็บใน MySql DB ในรูปแบบเป็นอย่างไรyyyy-MM-dd
Shantaram Tupe

@shantaram_t สิ่งนี้อาจช่วยคุณได้
Ankur Singhal

1
ฉันมีอินพุต: 02/10/2017และต้องการแปลงเป็น2017-10-02หรือ2017/10/02
Shantaram Tupe

43

@Temporal เป็นคำอธิบายประกอบ JPA ซึ่งสามารถใช้เพื่อจัดเก็บในตารางฐานข้อมูลในรายการคอลัมน์ต่อไปนี้:

  1. วันที่ ( java.sql.Date)
  2. เวลา ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

โดยทั่วไปเมื่อเราประกาศDateเขตข้อมูลในชั้นเรียนและพยายามจัดเก็บ
จะจัดเก็บเป็นTIMESTAMPในฐานข้อมูล

@Temporal
private Date joinedDate;

โค้ดด้านบนจะเก็บค่าไว้เหมือน08-07-17 04: 33: 35.870000000 PM

ถ้าเราต้องการที่จะเก็บเฉพาะวันที่ในฐานข้อมูลเราสามารถใช้
/ กำหนดTemporalType

@Temporal(TemporalType.DATE)
private Date joinedDate;

คราวนี้จะเก็บ08-07-17ในฐานข้อมูล

มีแอตทริบิวต์อื่น ๆ เช่นเดียวกับ@Temporalที่สามารถใช้ได้ตามข้อกำหนด


ค่าดีฟอลต์คือ TemporalType.DATE ไม่รู้ว่าทำไมคุณถึงระบุค่าแอตทริบิวต์ที่ไม่มีคำอธิบายประกอบในช่วงเวลา
Simon Logic

หากวันที่สองวันเหมือนกันโดยจะทำงานด้านบน (TemporalType.DATE)
Lova Chittumuri

อย่าคัดลอกวางคำตอบ stackoverflow.com/questions/25333711/…
Lova Chittumuri

11

ประเภท Temporal คือชุดของประเภทตามเวลาที่สามารถใช้ในการแมปสถานะแบบถาวร

รายการสนับสนุนประเภทชั่วคราวรวมถึงสามjava.sqlชนิดjava.sql.Date, java.sql.Timeและjava.sql.Timestampและจะมีสองjava.utilประเภทjava.util.Dateและjava.util.Calendarและ

java.sqlประเภทจะสมบูรณ์ไม่ยุ่งยาก พวกเขาทำหน้าที่เหมือนกับการทำแผนที่ประเภทอื่น ๆ และไม่จำเป็นต้องมีการพิจารณาเป็นพิเศษ

อย่างไรก็ตามทั้งสองjava.utilประเภทต้องการข้อมูลเมตาเพิ่มเติมเพื่อระบุjava.sqlประเภทJDBC ที่จะใช้เมื่อสื่อสารกับไดรเวอร์ JDBC สิ่งนี้ทำได้โดยการใส่คำอธิบายประกอบด้วย@Temporalคำอธิบายประกอบและระบุชนิด JDBC เป็นค่าของTemporalTypeชนิดที่แจกแจง

มีการแจกแจงค่า DATE, TIME และ TIMESTAMP สามค่าเพื่อแสดงถึงแต่ละjava.sqlประเภท


5

ใช้สิ่งนี้

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}

4

หากคุณกำลังมองหาคำตอบสั้น ๆ :

ในกรณีที่ใช้ java.util.Date Java ไม่ทราบวิธีเกี่ยวข้องโดยตรงกับประเภท SQL นี่คือเมื่อ@Temporalเข้ามาเล่น ใช้เพื่อระบุประเภท SQL ที่ต้องการ

ที่มา: Baeldung


3

ฉันใช้ Hibernate 5.2 และ@Temporalไม่จำเป็นอีกต่อไป
java.util.date , sql.date , time.LocalDateจะถูกเก็บไว้ในฐานข้อมูลโดยมีประเภทข้อมูลที่เหมาะสมเป็น Date / timestamp


แล้ววิธีแก้คืออะไรถ้าเราต้องการบันทึกวันที่โดยใช้ Hibernate 5.x
Kms

การใช้ Java 8 LocalDate
Josh

1

เราใช้คำอธิบายประกอบ @Temporal เพื่อแทรกวันที่เวลาหรือทั้งสองอย่างในตารางฐานข้อมูลการใช้ TemporalType เราสามารถแทรกข้อมูลเวลาหรือทั้งตาราง int

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.