48 lines
1.8 KiB
Java
48 lines
1.8 KiB
Java
package com.yunhai.userbase.common.converter;
|
||
|
||
import com.yunhai.platform.utils.enums.IEnum;
|
||
|
||
import javax.persistence.AttributeConverter;
|
||
|
||
/**
|
||
* 通用「int <-> 实现 IEnum<Integer> 的枚举」JPA 转换器抽象基类。<br>
|
||
* <p>
|
||
* <b>绑定机制(通用做法):</b>为每个枚举写一个极薄的子类,在构造器里传入枚举 class 即可完成绑定,
|
||
* 然后实体字段用 {@code @Convert(converter = XxxEnumConverter.class)} 引用该子类。例如:
|
||
* <pre>
|
||
* public class GroupTypeEnumConverter extends CommonIntEnumConverter<GroupTypeEnum> {
|
||
* public GroupTypeEnumConverter() { super(GroupTypeEnum.class); }
|
||
* }
|
||
* </pre>
|
||
* 这样同一套逻辑可服务任意枚举;又因为每个枚举拥有<b>独立的转换器实例</b>,
|
||
* 彼此之间不会串类型(标准 JPA 的 @Convert 是按 converter 类创建共享单例的,
|
||
* 若让多个不同枚举共用同一个泛型实例,则无法区分各自的枚举 class,故采用「每枚举一子类」的绑定方式)。
|
||
* </p>
|
||
*
|
||
* @param <E> 必须实现 IEnum<Integer> 的枚举类型
|
||
* @author chenx
|
||
*/
|
||
public abstract class CommonIntEnumConverter<E extends Enum<E> & IEnum<Integer>>
|
||
implements AttributeConverter<E, Integer> {
|
||
|
||
private final Class<E> enumCls;
|
||
|
||
protected CommonIntEnumConverter(Class<E> enumCls) {
|
||
this.enumCls = enumCls;
|
||
}
|
||
|
||
@Override
|
||
public Integer convertToDatabaseColumn(E enumVal) {
|
||
return enumVal == null ? null : enumVal.getKey();
|
||
}
|
||
|
||
@Override
|
||
public E convertToEntityAttribute(Integer dbVal) {
|
||
if (dbVal == null) {
|
||
return null;
|
||
}
|
||
// 读库安全:无匹配的枚举值返回 null(不抛异常,避免脏数据导致整棵树加载失败)
|
||
return IEnum.getByKey(enumCls, dbVal);
|
||
}
|
||
}
|