java enum or_JAVA枚举类型复写ordinal和name值

持久层用hibernate实现,在实体和数据库映射的时候,字段设为枚举有两种方式:

@Enumerated(EnumType.STRING)

@Column(name="invoice_type")

private InvoiceType invoiceType;

@Enumerated(EnumType.STRING)

这种的写法,是实体映射枚举的名字,即是枚举类的name属性。同时invoice_type字段在数据库中的属性为vachar类型

假设我的枚举类是以下内容:

public enum InvoiceType {

ONE,

TWO,

THREE;

}

那么将来数据里字段invoice_type的值就是 ONE或者 TWO 或者THREE;

再换另一种写法:

@Enumerated(EnumType.ORDINAL)

@Column(name="invoice_type")

private InvoiceType invoiceType;

@Enumerated(EnumType.ORDINAL)

这样的映射就会把枚举的ordinal的值赋给数据库的字段,大家都知道枚举的ordinary的值从0开始,以此往下数。这样的配置的话,数据库中

invoice_type这个字段的内容将来就是,0,1,2,3.。。。。。

上面的知识大家基本都知道了,讨论一下如果hibernate那层的配置没有别的方式,只能是

EnumType.STRING,

EnumType.ORDINAL

那么如果我们想改变枚举默认的ordinal和name该怎么办?废话不多说了,直接上代码对比:

未重写之前:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importjava.lang.reflect.Field;importjava.util.HashMap;importjava.util.Map;public enumInvoiceType {

INVALID(9, "你好1"),

OPEN(8, "你好2"),

UNOPEN(7, "你好3");

String name;intvalue;private static Map map = new HashMap();static{for(InvoiceType type : values()) {

map.put(type.ordinal(), type.name());

}

}private InvoiceType(intvalue, String name) {this.value =value;//初始化map列表

this.name =name;

}public static voidmain(String[] args) {

System.out.println(InvoiceType.getMap());

System.out.println(InvoiceType.INVALID.ordinal());

System.out.println(InvoiceType.INVALID.name());

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetValue() {returnvalue;

}public void setValue(intvalue) {this.value =value;

}public static MapgetMap() {returnmap;

}public static void setMap(Mapmap) {

InvoiceType.map=map;

}

}

View Code

运行结果:

{0=INVALID, 1=OPEN, 2=UNOPEN}

0

INVALID

重写以后:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.lang.reflect.Field;2 importjava.util.HashMap;3 importjava.util.Map;4

5 public enumInvoiceType1 {6

7 INVALID(9, "你好1"),8

9 OPEN(8, "你好2"),10

11 UNOPEN(7, "你好3");12

13 String name;14

15 intvalue;16

17 private static Map map = new HashMap();18

19 static{20 for(InvoiceType1 type : values()) {21 map.put(type.ordinal(), type.name());22 }23 }24

25 private InvoiceType1(intvalue, String name) {26 this.value =value;27 //初始化map列表

28 this.name =name;29 try{30 Field fieldName = getClass().getSuperclass().getDeclaredField("ordinal");31 fieldName.setAccessible(true);32 fieldName.set(this, value);33 fieldName.setAccessible(false);34

35 Field fieldName1 = getClass().getSuperclass().getDeclaredField("name");36 fieldName1.setAccessible(true);37 fieldName1.set(this, name);38 fieldName1.setAccessible(false);39

40 } catch(Exception e) {41 }42 }43

44 public static voidmain(String[] args) {45 System.out.println(InvoiceType1.getMap());46

47 System.out.println(InvoiceType1.INVALID.ordinal());48 System.out.println(InvoiceType1.INVALID.name());49 }50

51 publicString getName() {52 returnname;53 }54

55 public voidsetName(String name) {56 this.name =name;57 }58

59 public intgetValue() {60 returnvalue;61 }62

63 public void setValue(intvalue) {64 this.value =value;65 }66

67 public static MapgetMap() {68 returnmap;69 }70

71 public static void setMap(Mapmap) {72 InvoiceType1.map =map;73 }74 }

View Code

运行结果:

{7=你好3, 8=你好2, 9=你好1}

9

你好1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值