Việc sử dụng chú thích @Temporal trong Hibernate là gì?


101

Tài liệu Hibernate có thông tin bên dưới cho @Temporalchú thích:

Trong các API Java thuần túy, độ chính xác tạm thời của thời gian không được xác định. Khi xử lý dữ liệu tạm thời, bạn có thể muốn mô tả độ chính xác dự kiến ​​trong cơ sở dữ liệu. Dữ liệu thời gian có thể có độ chính xác DATE, TIME hoặc TIMESTAMP (tức là ngày thực, chỉ thời gian hoặc cả hai). Sử dụng chú thích @Temporal để tinh chỉnh điều đó.

Nghĩa temporal precision of time is not definedlà gì? temporalDữ liệu là gì và độ chính xác của nó? Làm thế nào để nó tinh chỉnh?


3
Nếu bạn sử dụng Lịch làm thuộc tính Thực thể của mình thì trong java thuần túy, nó in ra rất nhiều thông tin không cần thiết khi bạn muốn lưu nó vào cơ sở dữ liệu chẳng hạn. Trong trường hợp đó, bạn có thể có một cái gì đó như @Temporal (TemporalType.TIMESTAMP) Lịch lịch trong thực thể của bạn để lưu dấu thời gian vào cơ sở dữ liệu của bạn hoặc chỉ ngày hoặc chỉ thời gian bằng cách thay đổi thành @Temporal (TemporalType.DATE) hoặc @Temporal (TemporalType.TIME) trên thuộc tính Lịch của bạn.
user3487063

Câu trả lời:


104

Chú thích này phải được chỉ định cho các trường hoặc thuộc tính liên tục của kiểu java.util.Datejava.util.Calendar. Nó chỉ có thể được chỉ định cho các trường hoặc thuộc tính của các loại này.

Các Temporalchú thích có thể được sử dụng cùng với các Basicchú thích, các Idchú thích, hoặc ElementCollectionchú thích (khi giá trị bộ sưu tập phần tử là một loại thời gian như vậy.

Trong các API Java thuần túy, độ chính xác tạm thời của thời gian không được xác định. Khi xử lý dữ liệu tạm thời, bạn có thể muốn mô tả độ chính xác dự kiến ​​trong cơ sở dữ liệu. Dữ liệu thời gian có thể có độ chính xác DATE, TIME hoặc TIMESTAMP (tức là ngày thực, chỉ thời gian hoặc cả hai). Sử dụng @Temporalchú thích để tinh chỉnh điều đó.

Dữ liệu thời gian là dữ liệu liên quan đến thời gian. Ví dụ, trong hệ thống quản lý nội dung, ngày tạo và ngày cập nhật cuối cùng của một bài báo là dữ liệu tạm thời. Trong một số trường hợp, dữ liệu thời gian cần độ chính xác và bạn muốn lưu trữ ngày / giờ chính xác hoặc cả hai ( TIMESTAMP) trong bảng cơ sở dữ liệu.

Độ chính xác tạm thời không được chỉ định trong các API Java cốt lõi. @Temporallà một JPAchú thích chuyển đổi qua lại giữa dấu thời gian và java.util.Date. Nó cũng chuyển đổi time-stampthành thời gian. Ví dụ: trong đoạn mã dưới đây, @Temporal(TemporalType.DATE) giảm giá trị thời gian và chỉ giữ lại ngày .

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

Theo javadocs,

Chú thích để khai báo {@code TemporalType} thích hợp trên các tham số của phương thức truy vấn. Lưu ý rằng chú thích này chỉ có thể được sử dụng trên các tham số thuộc loại {@link Date} với mặc địnhTemporalType.DATE

[Thông tin trên được thu thập từ nhiều nguồn khác nhau]


Tại sao tôi không thể sử dụng nó với Dấu thời gian loại Java?
powder366

3
Vì vậy, nếu bạn chỉ sử dụng TemporalType.TIMESTAMP ... thì có bất kỳ điểm nào để sử dụng chú thích này không? Ngày dường như làm việc tốt vì mục đích này mà không có nó ..
Amalgovinus

làm thế nào tôi có thể lưu trữ trong MySql DB trong các định dạng nhưyyyy-MM-dd
Shantaram Tupe

@shantaram_t điều này có thể giúp bạn
Ankur Singhal

1
Tôi có đầu vào: 02/10/2017và muốn chuyển nó sang 2017-10-02hay2017/10/02
Shantaram Tupe

42

@Temporal là một chú thích JPA có thể được sử dụng để lưu trữ trong bảng cơ sở dữ liệu trên các mục cột sau:

  1. DATE ( java.sql.Date)
  2. TIME ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

Nói chung khi chúng ta khai báo một Datetrường trong lớp và cố gắng lưu trữ nó.
Nó sẽ lưu trữ dưới dạng TIMESTAMP trong cơ sở dữ liệu.

@Temporal
private Date joinedDate;

Mã trên sẽ lưu trữ giá trị có dạng như 08-07-17 04: 33: 35.870000000 PM

Nếu chúng ta chỉ muốn lưu trữ NGÀY trong cơ sở dữ liệu,
Chúng ta có thể sử dụng / xác định TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Lần này, nó sẽ lưu trữ 08-07-17 trong cơ sở dữ liệu

Có một số thuộc tính khác cũng như @Temporalcó thể được sử dụng dựa trên yêu cầu.


Giá trị mặc định là TemporalType.DATE. Không biết tại sao bạn lại cung cấp giá trị thuộc tính không có chú thích với phần thời gian.
Simon Logic

nếu hai ngày giống nhau thì khía cạnh trên đang hoạt động (TemporalType.DATE).
Lova Chittumuri

Đừng sao chép Dán câu trả lời. stackoverflow.com/questions/25333711/...
Lova Chittumuri

10

Các kiểu tạm thời là tập hợp các kiểu dựa trên thời gian có thể được sử dụng trong ánh xạ trạng thái liên tục.

Danh sách các loại thời gian được hỗ trợ bao gồm ba java.sqlloại java.sql.Date, java.sql.Timejava.sql.Timestamp, và nó bao gồm hai java.utilloại java.util.Datejava.util.Calendar.

Các java.sqlloại hoàn toàn không phức tạp. Chúng hoạt động giống như bất kỳ loại ánh xạ đơn giản nào khác và không cần xem xét đặc biệt.

java.utilTuy nhiên, hai loại cần siêu dữ liệu bổ sung để chỉ ra java.sqlloại JDBC nào sẽ sử dụng khi giao tiếp với trình điều khiển JDBC. Điều này được thực hiện bằng cách chú thích chúng bằng @Temporalchú thích và chỉ định kiểu JDBC làm giá trị của TemporalTypekiểu liệt kê.

Có ba giá trị được liệt kê là DATE, TIME và TIMESTAMP để đại diện cho từng java.sqlloại.


4

dùng cái này

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

public Calendar getCreateDate() {
    return createDate;
}

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

4

Nếu bạn đang tìm kiếm câu trả lời ngắn gọn:

Trong trường hợp sử dụng java.util.Date, Java không thực sự biết cách liên quan trực tiếp đến các kiểu SQL. Đây là khi @Temporalphát huy tác dụng. Nó được sử dụng để chỉ định kiểu SQL mong muốn.

Nguồn: Baeldung


3

Tôi sử dụng Hibernate 5.2 và @Temporalkhông cần thiết nữa.
java.util.date , sql.date , time.LocalDate được lưu trữ trong DB với kiểu dữ liệu thích hợp là Date / timestamp.


thì giải pháp là gì nếu chúng ta chỉ muốn lưu ngày bằng Hibernate 5.x
Kms

Sử dụng Java 8 LocalDate
Josh

1

Chúng tôi sử dụng chú thích @Temporal để chèn ngày, giờ hoặc cả hai trong bảng cơ sở dữ liệu. Sử dụng TemporalType, chúng tôi có thể chèn dữ liệu, thời gian hoặc cả hai bảng int.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.