Các annotation trong Hibernate
NỘI DUNG BÀI VIẾT
@Version
@CreationTimestamp và @UpdateTimestamp
@NamedQuery, @quan-nguyenameQueries
@PrePersist, @PostPersist, @PostLoad, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove:
@Version
@Entity
@Table(name = "customer")
public class Customer implements Serializable{
@Version
@Column(name = "version")
private int version;
//...
}
Code language: PHP (php)
Annotation @Version được dùng để đánh dấu column lưu trữ version của bản ghi và tự động cập nhật mỗi khi có thao tác trên bản ghi/ đối tượng.
Nhờ column lưu trữ version mà ta biết được đối tượng đó đã được cập nhật, chỉnh sửa lần nào hay chưa, nếu có thì đã chỉnh sửa bao nhiêu lần.
Column version còn dùng trong hibernate locking để kiểm tra xem 1 đối tượng có bị chỉnh sửa cùng lúc không.
Các kiểu dữ liệu với @Version
Column/thuộc tính được đánh dấu @Version có thể sử dụng 2 kiểu dữ liệu là kiểu số (int, short, long) hay kiểu ngày tháng (Date, TimeStamp…).
- Với kiểu số thì column sẽ được update tăng dần, lần đầu tiên lúc insert vào database thì column version sẽ được update là 0, sau đó mỗi lần thực hiện update nó sẽ tăng dần thành 2,3,4…
- Với kiểu ngày tháng thì mỗi khi insert hay update, column version sẽ được update bằng thời gian tại thời điểm insert/update (kiểu này hơi giống với annotation @UpdateTimestamp)
- Bạn cũng có thể config để update version khi thực hiện select
@CreationTimestamp và @UpdateTimestamp
Các field được đánh dấu @CreationTimestamp sẽ tự động lấy giá trị bằng thời gian lúc thực hiện insert.
Các field được đánh dấu @UpdatedTimestamp sẽ tự động cập nhật thời gian mỗi khi thực hiện insert/update
Các loại dữ liệu hỗ trợ: Date, Calendar, Time, Timestamp
@Entity
@Table(name = "customer")
public class Customer implements Serializable {
@Column(name = "created_datetime")
@CreationTimestamp
private Date createdDatetime;
@Column(name = "updated_datetime")
@UpdateTimestamp
private Date updatedDatetime;
//...
}
Code language: PHP (php)
@NamedQuery, @NameQueries
Được sử dụng để cung cấp các câu query dùng chung
Annotation @NameQueries được sử dụng để định nghĩa nhiều named query.
Annotation @NameQuery được sử dụng để định nghĩa một named query đơn.
@Entity
@Table(name = "customer")
@NamedQueries({
@NamedQuery(name = "Customer.FIND_ALL", query = "FROM Customer"),
@NamedQuery(name = "Customer.FIND_BY_NAME", query = "SELECT c FROM Customer c WHERE c.name like :name") })
public class Customer {
@Column(name = "name")
private String name;
...
}
Code language: CSS (css)
Annotation JPA callback method:
@PrePersist, @PostPersist, @PostLoad, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove: được dùng để đánh dấu các method lắng nghe các sự kiện khi đối tượng được thêm, sửa, xóa…
@Entity
@Table(name = "customer")
public class Customer implements Serializable{
...
@PrePersist
public void prePersist() {
System.out.println("pre persist!");
}
@PostPersist
public void postPersist() {
System.out.println("post persist!");
}
@PreUpdate
public void preUpdate() {
System.out.println("pre update!");
}
@PostUpdate
public void postUpdate() {
System.out.println("post update!");
}
@PreRemove
public void preRemove() {
System.out.println("pre remove!");
}
@PostRemove
public void postRemove() {
System.out.println("post remove!");
}
...
}
Code language: CSS (css)
Nguồn:
https://stackjava.com/hibernate/giai-thich-cac-annotation-trong-hibernate-code-vi-du.htm
https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
http://www.techferry.com/articles/hibernate-jpa-annotations.html
Leave a Reply