post-image

Các annotation trong Hibernate

JDBC & Hibernate

@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

Your email address will not be published. Required fields are marked *