package com.yunhai.userbase.common.converter; import com.yunhai.platform.utils.enums.IEnum; import javax.persistence.AttributeConverter; /** * 通用「int <-> 实现 IEnum<Integer> 的枚举」JPA 转换器抽象基类。
*

* 绑定机制(通用做法):为每个枚举写一个极薄的子类,在构造器里传入枚举 class 即可完成绑定, * 然后实体字段用 {@code @Convert(converter = XxxEnumConverter.class)} 引用该子类。例如: *

 *   public class GroupTypeEnumConverter extends CommonIntEnumConverter<GroupTypeEnum> {
 *       public GroupTypeEnumConverter() { super(GroupTypeEnum.class); }
 *   }
 * 
* 这样同一套逻辑可服务任意枚举;又因为每个枚举拥有独立的转换器实例, * 彼此之间不会串类型(标准 JPA 的 @Convert 是按 converter 类创建共享单例的, * 若让多个不同枚举共用同一个泛型实例,则无法区分各自的枚举 class,故采用「每枚举一子类」的绑定方式)。 *

* * @param 必须实现 IEnum<Integer> 的枚举类型 * @author chenx */ public abstract class CommonIntEnumConverter & IEnum> implements AttributeConverter { private final Class enumCls; protected CommonIntEnumConverter(Class 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); } }