来自:http://my.oschina.net/xinxingegeya/blog/359968
Hibernate 使用Enumerated_EnumType映射枚举字段
Enumerated 和 EnumType 是 jpa 的两个注解。这两个注解用来映射枚举字段。
有一个枚举类,如下,
package com.lyx;
/**
* Created by liyanxin on 2014/12/24.
*/
public enum Gender {
MAIL("男性"), FMAIL("女性");
private String value;
private Gender(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
}
有一个User 类 如下,
package com.lyx;
import java.io.Serializable;
import javax.persistence.*;
@Entity
@Table(name = "tb_user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "role_id", unique = false, nullable = false)
private Role role;
@Enumerated(EnumType.STRING)
@Column(name = "user_gender")
private Gender gender;
.......................
}
这块就是对枚举的映射配置,
@Enumerated(EnumType.STRING)
@Column(name = "user_gender")
private Gender gender;
且看生成后的数据库schema,如下,
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`role_id` int(11) NOT NULL,
`user_gender` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_1sfby1b8i8xi58er483adw21f` (`role_id`),
CONSTRAINT `FK_1sfby1b8i8xi58er483adw21f` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=206 DEFAULT CHARSET=latin1
`user_gender` varchar(255) DEFAULT NULL,
类型是varchar(255),此时枚举字段对应的持久化类型为字符串,是枚举的name
==================================================================
如果映射为如下,
@Enumerated(EnumType.ORDINAL)
@Column(name = "user_gender")
private Gender gender;
生成的数据库schema 为
`user_gender` int(11) DEFAULT NULL
插入几条数据看看什么效果,
id age user_gender name role_id
-- --- ----------- ---- -------
1 23 1 lyx 1
2 23 0 lyx 1
3 23 1 lyx 1
4 23 1 lyx 1
5 23 1 lyx 1
枚举类型 被持久化为 0 和 1 的int字段。(因为枚举类只有两个枚举字段,所以只有两个值,0和1,如果有三个枚举字段,那么就有三个值,0,1,2,以此类推。)
如果枚举字段上不加注解,那么枚举字段就会被默认映射为 int 类型存储。