本文章只用实现下面这些就可以实现,全局枚举操作
1.此类能实现web层,json数据的序列化和反序列化
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public enum SexEnum {
/**
*
*/
MEN(0, "男"),
WU_MEN(1, "女");
private Integer code;
private String msg;
@JsonCreator
public static SexEnum getEnum(Integer code) {
for (SexEnum anEnum : values()) {
if (anEnum.getCode().equals(code)) {
return anEnum;
}
}
throw new IllegalArgumentException("");
}
@JsonValue
public Integer getCode() {
return code;
}
SexEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setCode(Integer code) {
this.code = code;
}
}
2.如果想实现数据库的枚举映射则需要自定义Convert类
public class EnumConvert implements AttributeConverter<SexEnum,Integer> {
@Override
public Integer convertToDatabaseColumn(SexEnum sexEnum) {
return sexEnum.getCode();
}
@Override
public SexEnum convertToEntityAttribute(Integer integer) {
return SexEnum.getEnum(integer);
}
}
实体类需要添加 @Convert(converter = EnumConvert.class)
### 后期优化
因为每次添加一个枚举写一个转换类,太麻烦,代码量也大,就找了个方法,写了一个公共类 每个枚举只要实现 IBaseEnum类 ,在数据库实体 字段添加注解 @Type(type = "com..utils.DbEnumType"),就能实现全局注解使用;
1.IBaseEnum类
public interface IBaseEnum {
/**
* 描述
*
* @return
*/
String getMsg();
/**
* 状态码--数据值
*/
@JsonValue
Integer getCode();
@JsonCreator
static <T extends IBaseEnum> T fromCode(Class<T> enumType, Integer code) {
for (T object : enumType.getEnumConstants()) {
if (code.equals(object.getCode())) {
return object;
}
}
throw new BaseException("错误信息");
}
}
2.DbEnumType类
public class DbEnumType implements UserType, DynamicParameterizedType {
private Class enumClass;
private static final int[] SQL_TYPES = new int[]{Types.INTEGER};
@Override
public void setParameterValues(Properties parameters) {
final ParameterType reader = (ParameterType) parameters.get(PARAMETER_TYPE);
if (reader != null) {
enumClass = reader.getReturnedClass().asSubclass(Enum.class);
}
}
//枚举存储int值
@Override
public int[] sqlTypes() {
return SQL_TYPES;
}
@Override
public Class returnedClass() {
return enumClass;
}
/**
* 是否相等,不相等会触发JPA update操作
*
* @param x 参数
* @param y 参数
* @return
* @throws HibernateException
*/
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if (x == null && y == null) {
return true;
}
if (x == null || y == null) {
return false;
}
return x.equals(y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return x == null ? 0 : x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException {
String value = resultSet.getString(names[0]);
if (value == null) {
return null;
}
for (Object object : enumClass.getEnumConstants()) {
if (Objects.equals(Integer.parseInt(value), ((IBaseEnum) object).getCode())) {
return object;
}
}
throw new RuntimeException(String.format("Unknown name value [%s] for enum class [%s]", value, enumClass.getName()));
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, SQL_TYPES[0]);
} else if (value instanceof Integer) {
st.setInt(index, (Integer) value);
} else {
st.setInt(index, ((IBaseEnum) value).getCode());
}
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return value;
}
@Override
public boolean isMutable() {
return false;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) value;
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return cached;
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return original;
}