Code ví dụ Hibernate @Enumerated, lưu dữ liệu dạng Enum

Code ví dụ Hibernate @Enumerated, lưu dữ liệu dạng Enum.

(Xem thêm: Hướng dẫn tự học Hibernate)

Khi thực hiện insert dữ liệu, khai báo kiểu dữ liệu, thay vì dùng kiểu String, ta dùng kiểu Enum như thế khi code sẽ đảm bảo được giữ liệu chỉ nhận các giá trị nhất định.

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

Tạo database MySQL

CREATE SCHEMA `hibernate-demo-1` ;

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

Đối tượng employee có column position (vai trò) . Bây giờ mình chỉ muốn position nhận các giá trị cố định (DEVELOPER, TESTER, QA, MANAGER, BA) thì trong code mình sẽ tạo Enum với các thể hiện trên và dùng nó là type cho field position

Cấu trúc Project

Code ví dụ Hibernate @Enumerated, lưu dữ liệu dạng Enum

 

Các 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>HibernateEnumDemo</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, kết nối tới MySQL

<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 Enumerated</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:3306/hibernate-demo-1" />
      <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

File Enum
File PositionEnum.java định nghĩa các giá trị có thể nhận của field position
package stackjava.com.hibernatedemo.entities;

public enum PositionEnum {
  DEVELOPER, TESTER, MANAGER, QA, BA;
}

File entity

package stackjava.com.hibernatedemo.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

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

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
  
  @Column(name = "name")
  private String name;
  
  @Column(name = "position")
  @Enumerated(EnumType.STRING)
  private PositionEnum position;

  // getter - setter

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

Annotation @Enumerated sẽ đánh dấu field được lưu dạng enum, khi lưu vào database và đọc từ database ra, nó sẽ tự động lấy name của Enum đó.

Demo 1:

Insert đối tượng employee với field postion là 1 enum

package stackjava.com.hibernatedemo.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import stackjava.com.hibernatedemo.entities.Employee;
import stackjava.com.hibernatedemo.entities.PositionEnum;

public class DemoSave {

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

    
    Employee emp = new Employee();
    emp.setName("kai");
    emp.setPosition(PositionEnum.DEVELOPER);
    entityManager.persist(emp);
    
    entityManager.getTransaction().commit();
    System.out.println("---------- after save ---------------");
    System.out.println(emp);
    entityManager.close();
    entityManagerFactory.close();
  }

}

Kết quả:

Hibernate: insert into employee (name, position) values (?, ?)
---------- after save ---------------
Employee [id=1, name=kai, position=DEVELOPER]

Demo hibernate enum

Demo 2:

Đọc dữ liệu từ database và gán vào field Enum.

package stackjava.com.hibernatedemo.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import stackjava.com.hibernatedemo.entities.Employee;

public class DemoSelect {

  public static void main(String[] args) {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    
    Employee emp = entityManager.find(Employee.class, 1);
    System.out.println(emp);
    
    entityManager.getTransaction().commit();
    entityManager.close();
    entityManagerFactory.close();
  }

}

Kết quả:

Hibernate: select employee0_.id as id1_0_0_, employee0_.name as name2_0_0_, employee0_.position as position3_0_0_ from employee employee0_ where employee0_.id=?
Employee [id=1, name=kai, position=DEVELOPER]

Nếu bạn vào database và sửa giá trị column position thành 1 giá trị khác không nằm trong các giá trị (DEVELOPER, TESTER, QA, MANAGER, BA) nó sẽ báo lỗi vì không thể convert từ giá trị đó sang PositionEnum

Okay, Done!

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

 

References:

https://docs.jboss.org/…/html_single/#basic-enums

stackjava.com