Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp (thời gian tạo/sửa)

Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp (thời gian tạo/sửa)

Hibernate @CreationTimestamp, @UpdateTimestamp

(Xem lại: Giải thích annotation @CreattionTimestamp và @UpdateTimestamp)

Các công nghệ sử dụng trong ví dụ

Tạo database trên MySQL

Trong ví dụ này mình tạo cơ sở dữ liệu ‘hibernate-auto-update’ với table customer (id, name, address, updated_datetime, created_datetime)

  • Giá trị id tự tăng
  • column created_datetime sẽ dùng lưu thời gian tại thời điểm insert đối tượng vào database
  • column updated_datetime sẽ lưu thời gian mỗi khi thực hiện insert/update đối tượng vào database

Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp (thời gian tạo/sửa)

Tạo maven project

Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp (thời gian tạo/sửa)

Thư viện sử dụng

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.1.0.Final</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.11</version>
</dependency>

File cấu hình hibernate

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate-auto-update?useSSL=false</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.hibernate.current_session_context_class">thread</property>
        
        <mapping class="stackjava.com.hibernateautoupdate.entities.Customer" />
    </session-factory>
</hibernate-configuration>

File entity

package stackjava.com.hibernateautoupdate.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

@Entity
@Table(name = "customer")
public class Customer implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @Column(name = "name")
  private String name;

  @Column(name = "address")
  private String address;


  @Column(name = "created_datetime")
  @CreationTimestamp
  private Date createdDatetime;

  @Column(name = "updated_datetime")
  @UpdateTimestamp
  private Date updatedDatetime;

  // setter - getter - constructor

}

File DAO

package stackjava.com.hibernateautoupdate.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import stackjava.com.hibernateautoupdate.entities.Customer;

public class CustomerDAO {
  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
  
  public void save(Customer customer) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      session.save(customer);
      session.getTransaction().commit();
      System.out.println("saved!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }
  }

  public Customer findById(int id) {
    Session session = sessionFactory.openSession();
    Customer customer = session.load(Customer.class, id);
    System.out.println(customer);
    session.close();
    return customer;
  }

  public void showAll() {
    Session session = sessionFactory.openSession();
    List<Customer> list = session.createQuery("FROM Customer").list();
    for (Customer customer : list) {
      System.out.println(customer);
    }
    session.close();
  }

  public void update(Customer customer) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      session.update(customer);
      session.getTransaction().commit();
      System.out.println("updated!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }
  }

  public void delete(Customer customer) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      session.delete(customer);
      session.getTransaction().commit();
      System.out.println("deteted!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }
  }

}

File MainApp.java

package stackjava.com.hibernateautoupdate;

import stackjava.com.hibernateautoupdate.dao.CustomerDAO;
import stackjava.com.hibernateautoupdate.entities.Customer;

public class MainApp {
  public static void main(String[] args) {
//		demoInsert();
    demoUpdate();
  }
  
  public static void demoUpdate() {
    CustomerDAO customerDAO = new CustomerDAO();
    Customer customer = customerDAO.findById(2);
    customer.setAddress("Titan");
    customerDAO.update(customer);
  }
  
  public static void demoInsert() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.save(new Customer("Kai", "Viet Nam"));
    customerDAO.save(new Customer("Thanos", "Viet Nam"));
    customerDAO.save(new Customer("Thor", "Asgard"));
    customerDAO.save(new Customer("Hulk", "USA"));
    customerDAO.save(new Customer("Iron Man", "USA"));
  }
  
  public static void demoDelete() {
    CustomerDAO customerDAO = new CustomerDAO();
    Customer customer = customerDAO.findById(5);
    customerDAO.delete(customer);
  }
}

Demo

Demo1: insert đối tượng customer vào database

public static void demoInsert() {
  CustomerDAO customerDAO = new CustomerDAO();
  customerDAO.save(new Customer("Kai", "Viet Nam"));
  customerDAO.save(new Customer("Thanos", "Viet Nam"));
  customerDAO.save(new Customer("Thor", "Asgard"));
  customerDAO.save(new Customer("Hulk", "USA"));
  customerDAO.save(new Customer("Iron Man", "USA"));
}

Kết quả: hai column created_datetime và updated_datetime sẽ có giá trị bằng thời điểm thực hiện insert vào database

Demo1: insert đối tượng customer vào database

Demo2: Thực hiện update address của đối tượng customer có id = 2

public static void demoUpdate() {
  CustomerDAO customerDAO = new CustomerDAO();
  Customer customer = customerDAO.findById(2);
  customer.setAddress("Titan");
  customerDAO.update(customer);
}

Kết quả: giá trị của column updated_datetime cập nhật bằng thời gian thực hiện lệnh update, còn column created_datetime vẫn giữ nguyên

Demo2: Thực hiện update address của đối tượng customer có id = 2

Lưu ý, column created_datetime vẫn có thể bị thay đổi nếu bạn update nó sang giá trị khác. Để ngăn không cho update giá trị của column này ta chọn updatable = false cho nó

@Column(name = "created_datetime", updatable = false)

Code ví dụ hibernate annotation @CreationTimestamp, @UpdateTimestamp (thời gian tạo/sửa) stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

http://docs.jboss.org/…/hibernate/annotations/

https://docs.jboss.org/…/annotations/CreationTimestamp.html

http://docs.jboss.org/…/annotations/UpdateTimestamp.html

 

stackjava.com