使用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 类型存储。
===========================================