目录

最近有需求,想存自定义的枚举值,比如

 HOTLINE("Hotline")

我想存 Hotline 于是研究了一下Java的枚举问题

如下数据库的Entity (贫血模型哈)

@Entity
@Table(name = "complaint")
public class Complaint {
@Id
@GeneratedValue
private Long id; private CaseOrigin origin;
}

枚举

public enum CaseOrigin {
HOTLINE("Hotline"),
EMAIL("mail/fax/email"),
WALK_IN("Walk-in"),
OTHER("Others"); public String value() {
return value;
} private final String value; private CaseOrigin(String value) {
this.value = value;
}
}

用的是Spring Boot 自带的 Hibernate

Hibernate 提供了两种方便的注解

  • 1 也就是默认的注解 ,存是的 1,2,3,4,5 之类的数字
   @Enumerated(EnumType.ORDINAL)
private CaseOrigin origin;
  • 2 这是存枚举的name 如 : OTHER("Others") 存的是OTHER
   @Enumerated(EnumType.STRING)
private CaseOrigin origin;

但是这两种方式,都不符合我的需求,我想存的是 Others

于是,找到了目前为止最优雅的方式

实现接口 AttributeConverter 重写接口的方法,很表意,就不解释了。


public class CaseOriginConverter implements AttributeConverter<CaseOrigin, String> { @Override
public String convertToDatabaseColumn(CaseOrigin attribute) {
return attribute.value();
} @Override
public CaseOrigin convertToEntityAttribute(String dbData) {
return CaseOrigin.formDbValue(dbData);
}
}

枚举我们也要改造一下,当然,如果不想改造枚举类。在类CaseOriginConverter 重写convertToEntityAttribute(String dbData) 就要费点事了,比如switch,反射(最优雅的方式 )

public enum CaseOrigin {
HOTLINE("Hotline"),
EMAIL("mail/fax/email"),
WALK_IN("Walk-in"),
OTHER("Others"); public String value() {
return value;
} private final String value; public static final Map<String, CaseOrigin> dbValues = new HashMap<>(); static {
for (CaseOrigin value : values()) {
dbValues.put(value.value, value);
}
} private CaseOrigin(String value) {
this.value = value;
} public static CaseOrigin formDbValue(String dbValue) {
return dbValues.get(dbValue);
}
}

最后用的地方到了

   @Convert(converter = CaseOriginConverter.class)
private CaseOrigin origin;

这样就OK了。

Java 枚举那点事的更多相关文章

  1. java枚举和constant使用区别

    本文结合<Effective Java>第六章前半部分关于枚举的介绍和自己的理解及实践,讲解了Java枚举的知识点.文章发布于专栏Effective Java,欢迎读者订阅. 前言  你代 ...

  2. Java 枚举(enum)的学习

    Java 枚举(enum)的学习 本文转自:https://blog.csdn.net/javazejian/article/details/71333103 枚举的定义 在定义枚举类型时我们使用的关 ...

  3. 深入理解Java枚举

    深入理解Java枚举 重新认识Java枚举 老实说,挺羞愧的,这么久了,一直不知道Java枚举的本质是啥,虽然也在用,但是真不知道它的底层是个啥样的 直到2020年4月28日的晚上20点左右,我才真的 ...

  4. Java枚举-通过值查找对应的枚举

    一.背景 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...

  5. Java 枚举用法详解

    概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...

  6. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  7. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  8. 【转】Java 枚举7常见种用法

    原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu  原创地址:http://blog.li ...

  9. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

随机推荐

  1. 顶级域名和子级域名之间的cookie共享和相互修改、删除

    举例: js 设置 cookie: domain=cag.com 和 domain=.cag.com 是一样的,在浏览器cookie中,Domain都显示为 .cag.com. 就是说:以下2个语句是 ...

  2. linux同一台机子上用多个git 账号

    Step 1 - Create a New SSH KeyWe need to generate a unique SSH key for our second GitHub account. ssh ...

  3. HBase的BlockCache

    BlockCache 首先要明白Block,在HBase里面存储的最小单元:在memstore向硬盘刷的时候,如果目标block的大小+size之后大于MAX_SIZE,将会新创建一个block来存储 ...

  4. 关于hadoop集群管理系统搭建的规划说明

    Hadoop集群管理系统搭建是每个入门级新手都非常头疼的事情,因为你可能花费了很久的时间在搭建运行环境,最终却不知道什么原因无法创建成功.但对新手来说,运行环境搭建不成功的概率还蛮高的. 在之前的分享 ...

  5. 启动ECLIPSE时,提示找到不 eclipse\jre\bin\javaw.exe

    原因:在PATH中未配置 jre\bin目录 %JAVA_HOME%\jre\bin - 无论是用:D:\Asoft\Java\jdk1.7.0_45\jre\bin 还是:D:\Asoft\Java ...

  6. vim配置之目录结构

    我喜欢作配置分离,这样比较好管理,这里直接贴一下tree的目录结构 xxx@debian:~/vimConfig$ tree . ├── install │   ├── install.sh │   ...

  7. 执行Chrome自动化时--正在受到自动软件的控制的显示屏蔽

    用selenium启动,浏览器出现‘Chrome正在受到自动软件的控制’ 屏蔽的方法: # coding:utf-8 from selenium import webdriver # 加启动配置 op ...

  8. Python 标准库 ConfigParser 模块 的使用

    Python 标准库 ConfigParser 模块 的使用 demo #!/usr/bin/env python # coding=utf-8 import ConfigParser import ...

  9. Impala源码分析

    问题导读:1.Scheduler任务中Distributed Plan.Scan Range是什么?2.Scheduler基本接口有哪些?3.QuerySchedule这个类如何理解?4.Simple ...

  10. windows CIFS sabma协议识别

    今天在linux上搭建了CIFS协议,使用sabma4.7.0版本. 通过smbstatus可以查看smb软件的版本 通过/bin/smbstatus -d 0可以查看目前正连接的客户端. 问题来了: ...