Giải thích các annotation trong Hibernate (code ví dụ)
Các annotation trong hibernate
@CreationTimestamp và @UpdateTimestamp
@PrePersist, @PostPersist, @PostLoad, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove:
@Version
@Entity @Table(name = "customer") public class Customer implements Serializable{ @Version @Column(name = "version") private int version; //... }
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.
(Xem lại: Optimistic lock với @Version)
(Xêm thêm: Code ví dụ Hibernate annotation @Version)
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; //... }
(Xem thêm: Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp)
@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; ... }
(Xem thêm: Code ví dụ Hibernate Named Query (annotation @NamedQuery, @NameQueries))
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!"); } ... }
(Xem thêm: Code ví dụ với JPA Callbacks method @PrePersist, @PreUpdate, @PostRemove)
Giải thích các annotation trong Hibernate (code ví dụ) stackjava.com
References:
https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
http://www.techferry.com/articles/hibernate-jpa-annotations.html