STACKJAVA

Code ví dụ Hibernate ID tự tăng (@GeneratedValue, @GenericGenerator)

Code ví dụ Hibernate ID tự tăng (@GeneratedValue, @GenericGenerator).

(Xem thêm: Tự học Hibernate Framework qua code ví dụ)

(Xemtheem: Code ví dụ Hibernate tự sinh ID dạng text, String)

Khi insert data vào database, các primary key (id) bắt buộc phải là duy nhất. Để tiện lợi cho việc này trong Hibernate có cơ chế tự sinh ID giúp lập trình viên khi insert dữ liệu vào database không cần phải cung cấp ID cho object, cũng không cần quan tâm tới vấn đề trùng key.

Các công nghệ sử dụng

Tạo database

CREATE SCHEMA `hibernate-id-auto-increment` ;

CREATE TABLE `hibernate-id-auto-increment`.`employee` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));

Tạo Maven Project

Thư viện sử dụng

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>HibernateIdAutoIncrement</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
    <hibernate.version>5.3.6.Final</hibernate.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
  </dependencies>
</project>

File cấu hình hibernate – jpa

Chứa thông tin kết nối tới database (url, username, password), liệt kê các entity class được mapping với các table trong database.

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
  version="2.1">
  <persistence-unit name="persistence">
    <description>Demo Hibernate Id Auto Increment</description>
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/hibernate-id-auto-increment" />
      <property name="javax.persistence.jdbc.user" value="root" />
      <property name="javax.persistence.jdbc.password" value="admin1234" />
      <property name="hibernate.show_sql" value="true" />
    </properties>
  </persistence-unit>
</persistence>

Trong ví dụ này mình sử dụng entityManager nên sẽ khai báo file persistence.xml nếu các bạn sử dụng hibernateSession thì có thể khai báo file hibernate.cfg.xml

(Xem lại: Code ví dụ Hibernate EntityManager, EntityManagerFactory)

(Xem lại: Code ví dụ Hibernate Session, SessionFactory)

 File entity
package stackjava.com.hibernatedemo.entities;

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee {

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

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

  // getter - setter - constructor

  @Override
  public String toString() {
    return "Employee [id=" + id + ", name=" + name + "]";
  }

}
  • Ở đây mình sinh ID kiểu số tự tăng với GenerationType là GenerationType.IDENTITY
  • Với GenerationType là IDENTITY nó sẽ sử dụng giá trị AUTO_INCREMENT của mỗi table trên database, khi insert dữ liệu vào table nó sẽ tự động tăng giá trị AUTO_INCREMENT và sử dụng giá trị của AUTO_INCREMENT làm id.
  • Với các GenerationType khác như GenerationType.SEQUENCEGenerationType.AUTOGenerationType.TABLE các bạn phải tạo table để chứa giá trị tự tăng trong khi không phải tất cả các database đều hỗ trợ.

Demo

package stackjava.com.hibernatedemo;

import javax.persistence.*;

import stackjava.com.hibernatedemo.entities.Employee;

public class Demo {

  public static void main(String[] args) {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    Employee emp1 = new Employee("kai");
    Employee emp2 = new Employee("sena");
    entityManager.persist(emp1);
    entityManager.persist(emp2);

    entityManager.getTransaction().commit();
    System.out.println(emp1);
    System.out.println(emp2);
    entityManager.close();
    entityManagerFactory.close();
  }

}

Kết quả:

kiểm tra lại dữ liệu trong database:

 

Okay, Done!

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

References:

https://docs.jboss.org/…/GenericGenerator.html