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

问题描述

当我从实体中添加或删除列并且“旧”实体已经在缓存中并且我现在想加载“新”实体时出现错误。我在 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.java: 135) 在 org.hibernate.loader.entity.CacheEntityLoaderHelper.processCachedEntry(CacheEntityLoaderHelper.java:174) 在 org.hibernate.loader.entity.CacheEntityLoaderHelper 的 org.hibernate.loader.entity.CacheEntityLoaderHelper.convertCacheEntryToEntity(CacheEntityLoaderHelper.java:308) .loadFromSecondLevelCache(CacheEntityLoaderHelper.java:147) 在 org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:523) 在 org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208) 在 org. hibernate.event.internal.DefaultLoadEventListener。proxyOrLoad(DefaultLoadEventListener.java:327) at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) at 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 ) at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:203) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2819) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda $load$1(SessionImpl.java:2796) 在 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

标签: mysqlhibernatecachingredisredisson

解决方案


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

目前没有办法处理这个问题。


推荐阅读