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