如果在实体中添加或删除列,则使缓存(2LD 缓存休眠)无效。 (雷迪森)
Invalidate cache (2LD Cache Hibernate) if add or remove column in entity. (reddison)
当我在实体中添加或删除列并且“旧”实体已经在缓存中并且我现在想加载“新”实体时,我收到错误消息。我在 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:索引 3 在 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 在 org.hibernate.cache.spi.entry.StandardCacheEntryImpl.assemble(StandardCacheEntryImpl.java:135) 在 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 处超出长度 3 的范围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 缓存它当然可以工作,但出于性能原因我想使用二级缓存。有人对如何最好地处理这个问题有建议吗?
休眠版本:5.5.2.Final
当我在实体中添加或删除列并且“旧”实体已经在缓存中并且我现在想加载“新”实体时,我收到错误消息。我在 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:索引 3 在 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 在 org.hibernate.cache.spi.entry.StandardCacheEntryImpl.assemble(StandardCacheEntryImpl.java:135) 在 org.hibernate.type.TypeHelper.assemble(TypeHelper.java:97) 处超出长度 3 的范围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 缓存它当然可以工作,但出于性能原因我想使用二级缓存。有人对如何最好地处理这个问题有建议吗?
休眠版本:5.5.2.Final