優雅地實現java枚舉與int值地轉換(JPA)

使用

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章