You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Redisson提供的Hibernate二级缓存实体类名改为简单类名

解决方案

针对你在Hibernate二级缓存(Redisson作为提供者)中提取统一类名的需求,这里提供几种可行的实现方式:

方法1:解析CacheEntry的字符串输出(快速临时方案)

如果只是临时处理现有缓存的输出,可以通过字符串截取提取简单类名,利用全限定类名最后一个.后的内容:

Collection<Object> mylist = redissonClient.getMapCache("regionName").readAllValues();
List<String> simpleClassNames = new ArrayList<>();

// 匹配最后一对括号内的全限定类名
Pattern pattern = Pattern.compile("\\(([^)]+)\\)$");
for (Object item : mylist) {
    String itemStr = item.toString();
    Matcher matcher = pattern.matcher(itemStr);
    if (matcher.find()) {
        String fullClassName = matcher.group(1);
        String simpleName = fullClassName.substring(fullClassName.lastIndexOf('.') + 1);
        simpleClassNames.add(simpleName);
    }
}

注意:这种方法依赖toString()的输出格式,若Hibernate或Redisson修改输出结构,代码会失效,仅适合临时场景。

方法2:反射获取实际类的简单名称(更可靠)

如果能从CacheEntry中拿到实体的类元数据,通过反射获取类名是更稳定的方式,需根据Hibernate版本调整字段或类型转换逻辑:

Collection<Object> mylist = redissonClient.getMapCache("regionName").readAllValues();
List<String> simpleClassNames = new ArrayList<>();

for (Object item : mylist) {
    // 反射获取Item中的CacheEntry对象(需根据实际类型调整字段名)
    Field cacheEntryField = item.getClass().getDeclaredField("cacheEntry");
    cacheEntryField.setAccessible(true);
    Object cacheEntry = cacheEntryField.get(item);
    
    // 从CacheEntry中取出实体类信息
    Field entityClassField = cacheEntry.getClass().getDeclaredField("entityClass");
    entityClassField.setAccessible(true);
    Class<?> entityClass = (Class<?>) entityClassField.get(cacheEntry);
    
    String simpleName = entityClass.getSimpleName();
    simpleClassNames.add(simpleName);
}

若能引入Hibernate相关依赖,可直接强转简化代码:

// 需引入Hibernate的CacheEntry和Item类
CacheEntry cacheEntry = (CacheEntry) ((Item) item).getCacheEntry();
String simpleName = cacheEntry.getEntityClass().getSimpleName();

方法3:自定义缓存序列化逻辑(根源解决)

如果要彻底解决不同子项目类名不一致的问题,可自定义Redisson的序列化规则,存储时直接写入简单类名:

  1. 实现自定义Codec,在序列化CacheEntry时替换全限定类名为简单类名
  2. 配置Redisson客户端使用该Codec:
Config config = new Config();
config.setCodec(new CustomCacheEntryCodec());
RedissonClient redissonClient = Redisson.create(config);

这种方式需要深入了解Hibernate缓存的序列化机制,适合长期维护的项目。

内容的提问来源于stack exchange,提问作者User01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:50:24