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

标签 mysql hibernate caching redis redisson

当我从实体中添加或删除列并且“旧”实体已在缓存中并且我想加载"new"实体时,我收到错误。我在 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;
}

"new"实体:

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:索引 3 超出长度 3 的范围,位于 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 位于 org.hibernate.cache.spi.entry.StandardCacheEntryImpl.assemble(StandardCacheEntryImpl .java:135)在org.hibernate.loader.entity.CacheEntityLoaderHelper.convertCacheEntryToEntity(CacheEntityLoaderHelper.java:308)在org.hibernate.loader.entity.CacheEntityLoaderHelper.processCachedEntry(CacheEntityLoaderHelper.java:174)在org.hibernate.loader。 Entity.CacheEntityLoaderHelper.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) 在 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) 在org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2796) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2752) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl .load(SessionImpl.java:2796) 位于 org.hibernate.internal.SessionImpl$SimpleNaturalIdLoadAccessImpl.load(SessionImpl.java:3241) 位于

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

Hibernate 版本:5.5.2.Final

最佳答案

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

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

关于mysql - 如果在实体中添加或删除列,则使缓存(2LD 缓存 Hibernate)无效。 (雷迪森),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68236818/

相关文章:

java - 如何在 Hibernate 中设置只读列?

ios - 报亭内存存储问题,如何获取应用程序缓存目录?

asp.net - Distributed Cache/Session 我应该转向哪里?

php - 如何将 ids 与 mysql 中不同表中的名称匹配?

mysql - 选择具有自己关系条件的关系的记录数?

java - 优化/改进我的 SQL 更新

java - Spring Hibernate 处理 500 万条记录的方法

php - MySQL Query从数组值查询另一个表

hibernate - 为什么 Envers 为每个表创建一个审计表

ios - IOS应用应该使用什么Cache方式