使用
import lombok.Data;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor//爲final字段創建構造函數
public enum Process implements ConvertibleEnum {
CREATED(1000)//已創建,未提交
, POSTED(1100)//已提交,未被查看
, REVIEWED(1200)//已被查看
;
@Getter
private final Integer value;
public static Converter converter = new Converter();
public static class Converter extends EnumAttributeConverter<Process> {
public Converter() {
super(values());
}
}
}
測試:
import org.junit.Assert;
import org.junit.Test;
public class EnumConverterTest {
@Test
public void test() {
Process process = Process.converter.convertToEntityAttribute(1000);//可直接根據值來獲取枚舉類型
System.out.println(process);//輸出CREATED
Assert.assertNotNull(process);
}
}
相關實現:
public interface ConvertibleEnum {
Integer getValue();
}
import javax.persistence.AttributeConverter;
public abstract class EnumAttributeConverter<T extends ConvertibleEnum> implements AttributeConverter<T, Integer> {
final T[] values;
public EnumAttributeConverter(T[] values) {
this.values = values;
}
@Override
public Integer convertToDatabaseColumn(T attribute) {
return attribute.getValue();
}
@Override
public T convertToEntityAttribute(Integer dbData) {
for (T value : values) {
if (value.getValue().equals(dbData))
return value;
}
return null;
}
public T convertToEntityAttributeHard(Integer dbData) {
T t = convertToEntityAttribute(dbData);
if (t != null)
return t;
else throw new IllegalArgumentException("不存在指定枚舉" + dbData);
}
}