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