使用Enumerated && EnumType映射枚举字段

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

=====================END======================

你可能感兴趣的:(使用Enumerated && EnumType映射枚举字段)