#mysql #hibernate #caching #redis #redisson
Вопрос:
Когда я добавляю или удаляю столбец из сущности, и «старая» сущность уже была в кэше, и я хочу загрузить «новую» сущность, теперь я получаю ошибку. Я использую 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 выходит за рамки длины 3 в организации.спящий режим.введите.TypeHelper.сборка(TypeHelper.java:97) в org.hibernate.cache.spi.запись.StandardCacheEntryImpl.сборка(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) в организации.спящий режим.событие.внутреннее.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) в организации.спящий режим.событие.служба.внутренний.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.доступ к$2100(SessionImpl.java:203) в org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2819) в org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$загрузите$1(SessionImpl.java:2796) в организации.спящий режим.внутренний.SessionImpl$IdentifierLoadAccessImpl.выполнить(SessionImpl.java:2752) в org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2796) в org.hibernate.internal.SessionImpl$SimpleNaturalIdLoadAccessImpl.load(SessionImpl.java:3241) в
Я также не хочу очищать объект из кэша, так как он ничего не сделает, так как у меня одновременно запущено несколько приложений, и всегда может случиться так, что у них нет последних объектов, и для обеспечения высокой доступности я не всегда могу их перезапустить. Без кэша повторного использования это, конечно, работает, но я хочу использовать кэш второго уровня по соображениям производительности. У кого-нибудь есть предложения о том, как лучше всего с этим справиться?
Спящий режим-Версия: 5.5.2.Окончательная
Ответ №1:
Похоже, этот вопрос был задан недавно: https://discourse.hibernate.org/t/hibernate-second-level-cache-no-fallback-to-db-if-deserialization-fails/5516
В настоящее время нет способа справиться с этим.
Комментарии:
1. Уже возникла проблема. hibernate.atlassian.net/browse/HHH-14713 И некоторые другие тоже создали проблему, как я вижу. hibernate.atlassian.net/browse/HHH-14710 Надеюсь, это будет исправлено в ближайшее время, потому что поэтому я обязан отключить кэш второго уровня.
2. Самый быстрый способ сделать это-сделать это самостоятельно и предоставить для этого PR 😉