Java 带有JBoss缓存的ClassCastException

Java 带有JBoss缓存的ClassCastException,java,hibernate,jboss5.x,jboss-cache,Java,Hibernate,Jboss5.x,Jboss Cache,我们正在使用JBossSOA5.3.1和JBoss缓存以及hibernate二级缓存 除了嵌套类型com.example.GUID之外,所有这些都适用于简单的实体 GUID位于CommonUtil.jar中,该文件包含在每个ESB中 其他嵌套值,如Joda DateTime实例,在ESB之间可以正常工作,但Joda-time.jar位于中心JBoss/lib文件夹中,因此使用了全局类加载器 当ESB尝试从另一个ESB以前加载的缓存中检索值时,就会出现问题,因为缓存的GUID类类型是另一个实例。

我们正在使用JBossSOA5.3.1和JBoss缓存以及hibernate二级缓存

  • 除了嵌套类型com.example.GUID之外,所有这些都适用于简单的实体
  • GUID位于CommonUtil.jar中,该文件包含在每个ESB中
  • 其他嵌套值,如Joda DateTime实例,在ESB之间可以正常工作,但Joda-time.jar位于中心JBoss/lib文件夹中,因此使用了全局类加载器
  • 当ESB尝试从另一个ESB以前加载的缓存中检索值时,就会出现问题,因为缓存的GUID类类型是另一个实例。当Hibernate尝试使用它调用setGuid()时,会引发ClassCastException
  • 我已尝试将hibernate.cache.use_structured_entries=true设置为true,但这并不能解决问题
我的问题是,我们如何配置JBoss缓存和/或JBoss-classloading.xml以在ESB之间共享这个辅助的非实体类GUID以避免问题

例外

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;
    }
    ...
}

在向RedHat发送了许多支持电子邮件之后,我们找到的唯一答案是将GUID类型更改为字符串。

只是为了确保。。。你说的是EJB还是ESB?那么也把CommonUtil.jar移到jboss/lib文件夹中吧?尽管JBoss 4、5、6和7之间的类加载差异很大,JBoss社区论坛可能会给你一个更好的答案。看起来这是唯一的解决方案,但是我们是一个40+开发人员的大型项目,即将结束。我试图避免任何破坏性的变化。