如果在实体中添加或删除列,则使缓存无效(2LD 缓存休眠)。 (雷迪森)

Posted

技术标签:

【中文标题】如果在实体中添加或删除列,则使缓存无效(2LD 缓存休眠)。 (雷迪森)【英文标题】:Invalidate cache (2LD Cache Hibernate) if add or remove column in entity. (reddison) 【发布时间】:2021-09-15 02:16:20 【问题描述】:

当我从实体中添加或删除列并且“旧”实体已经在缓存中并且我现在想加载“新”实体时出现错误。我在 Hibernate 中使用 Redisson 作为 2LD 缓存。

“旧”实体:

public class TestEntity implements Serializable 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "p_id", updatable = false, unique = true, nullable = false)
private Long id;

@NaturalId
@Column(name = "p_uuid")
private String uuid;

@Column(name = "p_name")
private String name;

@Column(name = "test_int")
private int test;

“新”实体:

public class TestEntity implements Serializable 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "p_id", updatable = false, unique = true, nullable = false)
private Long id;

@NaturalId
@Column(name = "p_uuid")
private String uuid;

@Column(name = "p_name")
private String name;

@Column(name = "test_int")
private int test;

@Column(name = "bool")
private boolean bool; //new column

错误:

java.lang.ArrayIndexOutOfBoundsException:在 org.hibernate.cache.spi.entry.StandardCacheEntryImpl.assemble(StandardCacheEntryImpl 的 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 处的索引 3 超出了长度 3 .java:135) 在 org.hibernate.loader.entity.CacheEntityLoaderHelper.processCachedEntry(CacheEntityLoaderHelper.java:174) 在 org.hibernate.loader.convertCacheEntryToEntity(CacheEntityLoaderHelper.java:308)。 entity.CacheEntityLoaderHelper.loadFromSecondLevelCache(CacheEntityLoaderHelper.java:147) at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:523) at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)在 org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327) 在 org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) 在 org.hibernate.event .internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) 在 org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) 在 org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1215) ) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1204) 在 org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:203) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl .java:2819) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2796) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2752) at org.hibernate .internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2796) at org.hibernate.internal.SessionImpl$SimpleNaturalIdLoadAccessImpl.load(SessionImpl.java:3241) at

我也不想从缓存中清除实体,因为它不会做任何事情,因为我有多个应用程序同时运行,并且总是会发生它们没有最新的实体并保证高可用性我不能总是重新启动它们。如果没有 redisson 缓存,它当然可以工作,但出于性能原因,我想使用二级缓存。有没有人建议如何最好地处理这个问题?

休眠版本:5.5.2.Final

【问题讨论】:

【参考方案1】:

最近好像有人问过这个问题:https://discourse.hibernate.org/t/hibernate-second-level-cache-no-fallback-to-db-if-deserialization-fails/5516

目前没有办法处理。

【讨论】:

已经创建了一个问题。 hibernate.atlassian.net/browse/HHH-14713 正如我所见,其他一些人也产生了问题。 hibernate.atlassian.net/browse/HHH-14710希望它会尽快修复,因为我不得不禁用二级缓存。 完成这项工作的最快方法是自己动手并为其提供 PR ;)

以上是关于如果在实体中添加或删除列,则使缓存无效(2LD 缓存休眠)。 (雷迪森)的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 - 无效的列名称'* _ID“

缓存失效

向实体添加@Cachable 无效

git删除缓存区中文件

git如何删除已经 add 的文件 (如何撤销已放入缓存区文件的修改)

模式对象依赖关系:减少无效的文档中提到的指南真的有意义吗?