Hibernate @Enumerated, lưu dữ liệu dạng Enum

JDBC & 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:

  • Maven
  • JDK 1.8
  • Eclipse
  • MySQL

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`));Code language: JavaScript (javascript)

Đố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

pom.xml

<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>Code language: HTML, XML (xml)

File cấu hình hibernate, kết nối tới MySQL

persistence.xml

<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>Code language: HTML, XML (xml)

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 EnumFile PositionEnum.java định nghĩa các giá trị có thể nhận của field position

PositionEnum.java

package stackjava.com.hibernatedemo.entities;
public enum PositionEnum {
  DEVELOPER, TESTER, MANAGER, QA, BA;
}Code language: PHP (php)

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 + "]";
  }
  
  
}Code language: JavaScript (javascript)

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

DemoSave.java

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();
  }
}Code language: JavaScript (javascript)

Kết quả:

Hibernate: insert into employee (name, position) values (?, ?)
---------- after save ---------------
Employee [id=1, name=kai, position=DEVELOPER]Code language: CSS (css)
Demo hibernate enum

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.

Nguồn: https://stackjava.com/hibernate/code-vi-du-hibernate-enumerated-luu-du-lieu-dang-enum.html

Tài liệu tham khảo:

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

Leave a Reply

Your email address will not be published. Required fields are marked *