Hibernate @Enumerated, lưu dữ liệu dạng Enum
NỘI DUNG BÀI VIẾT
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
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)
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:
Leave a Reply