Springboot JPA 枚举Enum类型存入到数据库
程序员文章站
2022-04-20 20:05:42
...
1、使用JPA 的@Enumerated
注解 ,可以直接将Enum
映射到数据库中。但是value
的值只有两种方式选择,一种是使用枚举的序号映射,一种是枚举的名称来映射。
public enum EnumType {
/** Persist enumerated type property or field as an integer. */
ORDINAL,
/** Persist enumerated type property or field as a string. */
STRING
}
如果想存入枚举中的自定义的值,则需要实现AttributeConverter
接口
2、实现AttributeConverter
接口方式,@Covert 注解使用
/**
* @param <DB> : 保存到数据库的数据类型
* @author peter
* date: 2019-05-15 16:57
**/
public interface PersistEnum2DB<DB> {
DB getData();
}
import javax.persistence.AttributeConverter;
/**
* @param <ATTR> 实体类中枚举的类型,需实现{@link PersistEnum2DB} 接口
* @param <DB> 保存到数据库的数据类型
* @author peter
* date: 2019-05-15 16:59
*/
public abstract class AbstractEnumConverter<ATTR extends Enum<ATTR> & PersistEnum2DB<DB>, DB> implements AttributeConverter<ATTR, DB> {
private final Class<ATTR> clazz;
public AbstractEnumConverter(Class<ATTR> clazz) {
this.clazz = clazz;
}
@Override
public DB convertToDatabaseColumn(ATTR attribute) {
return attribute != null ? attribute.getData() : null;
}
@Override
public ATTR convertToEntityAttribute(DB dbData) {
if (dbData == null) return null;
ATTR[] enums = clazz.getEnumConstants();
for (ATTR e : enums) {
if (e.getData().equals(dbData)) {
return e;
}
}
throw new UnsupportedOperationException("枚举转化异常。枚举【" + clazz.getSimpleName() + "】,数据库库中的值为:【" + dbData + "】");
}
}
使用方式
import com.tourcoo.parking.enums.convert2db.AbstractEnumConverter;
import com.tourcoo.parking.enums.convert2db.PersistEnum2DB;
/**
* @author peter
* create: 2019-05-15 14:33
**/
public enum PayStatus implements PersistEnum2DB<Integer> {
NONPAY(0, "未支付"),
PAID(1, "已支付");
private int code;
private String msg;
PayStatus(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
@Override
public Integer getData() {
return code;
}
public static class Converter extends AbstractEnumConverter<PayStatus, Integer> {
public Converter() {
super(PayStatus.class);
}
}
}
//支付状态
@Convert(converter = PayStatus.Converter.class)
private PayStatus payStatus;
上一篇: Redis实现模糊删除
下一篇: 在Redux里怎么存数据?论数据标准化