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
Tạo maven project
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
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
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



