Java实体(本例中的orm为jpa)enum与数据库enum映射

1. 实体与表字段定义

1.1. 实体定义

package com.boot.domain;

import com.boot.base.common.domain.AbstractEntity;
import lombok.Data;
import javax.persistence.*;
/**
 * @Description 用户实体
 * @Author admin
 * @Date 2020/7/2
 */
@Data
@Entity
@Table(name = "user")
public class user {
	private String name;
    private Gender gender;
    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "enum")
    public EnumAO getGender() {
        return gender;
    }
}

package com.boot.domain;
/**
 * @Description 性别枚举
 * @Author admin
 * @Date 2020/11/7
 */
public enum Gender {
	/** 注意:
	 * 1.java实体中的枚举的下标索引从0开始,而数据库的enum类型的索引是从1开始!
	 * 2.此处的1、2对应的时数据库中的对应字段gender的enum类型的索引!
	 */
    MAN(1),
    WOMAN(2);
    private int value;
    EnumAO(int i) {
        this.value = i;
    }
    public int getValue() {
        return value;
    }
    public static Gender getGender(int i) {
        switch (i) {
            case 1:
            return MAN;
            case 2:
            return WOMAN;
        }
        return null;
    }
}

@RestController
@RequestMapping("/user")
public class AppController extends AbstractController {
 /**
   * 保存用户
   * 备注:测试方法 
   * @param user
   * @return
   */
    @PostMapping("/user")
    public Result save(@RequestBody User user) {      
  /**user.getGender().getValue()对应请求参数中的0或1*/       		    appOpinion.setGender(Gender.getGender(user.getGender().getValue()));
        // 用户业务层保存用户信息方法
       userService.save(user);
        return new Result("success");
    }
}

/** postman发生请求: */
url:http://localhost:8080/user
method:POST
{
  "name":"小明",
  "gender":0
}
// 注意:参数"gender"传0时对应枚举类Gender中的MAN,传1时WOMAN;因java中的enum类型元素下标索引从0开始,而数据库的enum是从1开始!
 

1.2. 表字段定义

create table app_opinion
(
    name          varchar(50)                         not null comment '姓名',
    gender     enum ('MAN', 'WOMAN')                   null comment '性别'
);
**备注:表字段gender类型被指定为enum类型的意义:
有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表!(内容来自mysql官网并进行的翻译)**

3. 关于可能出现的错误原因及解决

当插入一条记录是可能产生的错误:[01000][1265] Data truncated for column ‘gender’ at row 1
原因:没有对应的enum类型索引下标!如:insert into user(name, gender) values (‘xiaoming’, 3);会报以上错误,因为enum (‘MAN’, ‘WOMAN’) 对应的下标只有1和2!
解决:插入时必须对应存在的/正确的下标值!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值