ClassCastException с кешем JBoss
Мы используем JBoss SOA 5.3.1 с JBoss-кешем в спящем кеше 2-го уровня.
- Все отлично работает для простых объектов, кроме вложенного типа com.example.GUID;
- GUID находится в CommonUtil.jar, который включен в каждый ESB.
- Другие вложенные значения, такие как экземпляры Joda DateTime, отлично работают между ESB, но joda-time.jar находится в центральной папке JBoss/lib, и поэтому используется глобальный загрузчик классов.
- Проблема возникает, когда ESB пытается извлечь значение из кэша, который ранее был загружен другим ESB, поскольку кэшированный тип класса GUID является другим экземпляром, и ClassCastException генерируется, когда Hibernate пытается вызвать setGuid(), используя его.
- Я попытался установить hibernate.cache.use_structured_entries = true, но это не решает проблему
Мой вопрос заключается в том, как мы можем настроить кэш JBoss и / или jboss-classloading.xml для совместного использования этого GUID вспомогательного не-сущностного класса между ESB, чтобы избежать проблемы.
Исключение
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.example.Equipment.guid
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:127)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:351)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:232)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3690)
at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:139)
at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:105)
at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:587)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:542)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:397)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:908)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:876)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590)
at org.hibernate.type.EntityType.resolve(EntityType.java:412)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:139)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1030)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:987)
at org.hibernate.loader.Loader.doQuery(Loader.java:896)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:298)
at org.hibernate.loader.Loader.doList(Loader.java:2455)
at org.hibernate.loader.Loader.doList(Loader.java:2440)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2316)
at org.hibernate.loader.Loader.list(Loader.java:2311)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:414)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:364)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1192)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:116)
... 29 more
Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@76e6d130
at sun.reflect.GeneratedMethodAccessor437.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65)
... 59 more
Лицо
import com.example.GUID
@Entity
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Table(name = "EQUIPMENT")
public class Equipment implements Serializable {
private GUID guid;
@Column(name = "GUID")
@Type(type = "com.example.PersistentGUID")
public GUID getGuid() {
return guid;
}
...
}
1 ответ
Решение
Единственный ответ, который мы нашли на это после многих писем в службу поддержки RedHat, состоял в том, чтобы изменить тип GUID на строку.