Ứng dụng của đăc tính @Temporal trong JPA

Người dịch: Dương Xuân Long - Học viên lớp Java10
Email liên hệ: linesco218@gmail.com
Bài viết gốc: roytuts.com

1.Đặc tính @Temporal

Trong hướng dẫn này minh sẽ nói cho cá bạn biết về ứng dụng của đặc tính @Temporal trong JPA(Java Persistence API). @Temporal là một đặc tính của JPA và thường được chỉ rõ là ở persistent fields hoặc properties of type java.util.Date và java.util.Calendar.

Chung lại bạn có thể sử dụng đặc tính @Temporal trong ngày(date) hoặc trường lịch(calendar field) trong lớp thực thể khi bạn đang phác thảo bảng dữ liệu và các lớp java nơi mà HIbernate được dùng như một khung ORM.

2.@Temporal trong Java 8 Date API

Bạn sẽ không thể ứng dụng @Temporal trong java 8 date time API. Nếu bạn cố gắng để dùng @Temporal trong Java 8 date time API bạn sẽ nhận được ngoại lệ như được chỉ ra bên dưới trong thời gian chạy ứng dụng của bạn.

org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property

3.@Temporal trong Java Date API

Trong Java APIs cơ bản, sự chính xác về mặt thời gian không được định nghĩa. Khi làm việc với dữ liệu gian, bạn có thể muốn định nghĩa sự chính xác trong cơ sở dữ liệu. Dữ liệu liên quan đến thời gian có thể có DATE, TIME, hoặc TIMESTAMP sự chính xác(ngày chính xác hoặc chỉ thời gian hoặc cả hai). Ban có thể dùng @Temporal để lấy được sự chính xác của date,time hoặc cả hai.

Thực tế,khi bạn khai báo trường Date trong class và cố để lưu trữ nó trong bảng cơ sở dữ liệu, nó sẽ lưu trữ mốc thời gian trong cơ sở dữ liệu. Ví dụ.

@Column(name="create_date")
private Date createDate;

Vậy giá trị cho trường ở trên sẽ được lưu trữ trong cơ sở dữ liệu, ví dụ 08-08-22 04:33:35.880000000 AM, nhưng bạn có thể chỉ muốn lưu ngày trong cột. Đây là lúc bạn muốn dùng @Temporal trong JPA trên Java Date hoặc đối tượng Calendar(trước Java 8).

Vậy khi khai báo một trường trong entity class như ở dưới dùng @Temporal annotation với TemporalType.DATE:

@Temporal(TemporalType.DATE)
@Column(name="create_date")
private Date createDate;

Nếu bạn chỉ muốn lưu trữ thời gian thì hãy dùng ví dụ dưới đây cùng với @@Temporal annotation với TemporalType.TIME:

@Temporal(TemporalType.TIME)
@Column(name="create_date")
private Date createDate;

Nếu bạn muốn lưu mốc thời gian hãy sử dụng @Temporal annotation với TemporalType.TIMESTAMP:

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

4.Kết luận

-@Temporal trong JPA sẽ chuyển đổi java’s java.util.Date or java.util.Calendar to TIME (java.sql.Time), DATE(java.sql.Date) hoặc TIMESTAMP (java.sql.Timestamp) trong cột của cơ sở dữ liệu .