2010-09-02 6 views
7

¿Cómo soluciono la causa de la excepción ocasional IllegalArgumentException occurred while calling setter que arroja Hibernate cuando mi programa intenta cargar un usuario por nombre de la base de datos?¿Cómo se puede curar la causa de la excepción de Hibernate "IllegalArgumentException ocurrió al llamar a setter"?

¿Estoy incorrecta asignación de columnas en la tabla USER_RVUser a clase Integer en lugar de BigDecimal o algún otro tipo entero? Tenga en cuenta que la misma aplicación asigna columnas NUMBER en otras tablas a objetos Integer, pero Hibernate no incluye arroje esta excepción cuando rellene un objeto con una fila de esas tablas.

nota además que el programa permite RMI réplica de memoria caché para la caché Usuario sólo. ¿Podría esta excepción estar relacionada con la replicación de caché? ¿Es un error en Ehcache o Hibernate?

Caused by: org.springframework.orm.hibernate3.HibernateSystemException: IllegalArgumentException occurred while calling setter of com.db.spgit.abstrack.model.User.rv; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.db.spgit.abstrack.model.User.rv 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1055) 
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1048) 
    at com.db.abstrack.dao.hibernate.AbstrackDaoHibernate.findByCriteria(AbstrackDaoHibernate.java:57) 
    at com.db.abstrack.dao.hibernate.UserDaoHibernate.loadByName(UserDaoHibernate.java:63) 
    at com.db.spgit.abstrack.manager.QuoteManager.populateUser(QuoteManager.java:330) 
    at com.db.spgit.abstrack.manager.QuoteManager.populateOwnerUK(QuoteManager.java:307) 
    at com.db.spgit.abstrack.manager.QuoteManager.populateGuids(QuoteManager.java:254) 
    at com.db.spgit.abstrack.manager.QuoteManager.addQuoteReturnVwRfqUK(QuoteManager.java:429) 
    at com.db.spgit.abstrack.manager.QuoteManager$$FastClassByCGLIB$$d817accb.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) 
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635) 
    at com.db.spgit.abstrack.manager.QuoteManager$$EnhancerByCGLIB$$cc8d0025.addQuoteReturnVwRfqUK(<generated>) 
    at com.db.abstrack.ejb.RfqBean.addRfqDraftListUK(RfqBean.java:370) 
    ... 59 more 
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.db.spgit.abstrack.model.User.rv 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) 
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3514) 
    at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:116) 
    at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:82) 
    at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:553) 
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:357) 
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139) 
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:179) 
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103) 
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) 
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:557) 
    at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196) 
    at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:130) 
    at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2152) 
    at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2117) 
    at org.hibernate.loader.Loader.list(Loader.java:2087) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) 
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) 
    at org.springframework.orm.hibernate3.HibernateTemplate$36.doInHibernate(HibernateTemplate.java:1065) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419) 
    ... 77 more 
Caused by: java.lang.IllegalArgumentException: [email protected] 
    at sun.reflect.GeneratedMethodAccessor104.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:42) 
    ... 101 more 

Definición de clase User:

@Entity 
@Proxy(lazy=false) 
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL) 
@Table(name="TB_USER" 
    ,schema="ABSOL_USER" 
) 
public class User implements java.io.Serializable { 
    private String id; 
    private String userName; 
    private Integer rv; 

    public User() { 
    } 

    public User(String userName, Integer rv) { 
     this.userName = userName; 
     this.rv = rv; 
    } 

    @GenericGenerator(name="generator", strategy="guid")@Id @GeneratedValue(generator="generator") 

    @Column(name="USER_ID", unique=true, nullable=false) 
    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Column(name="USER_NAME", nullable=false, length=20) 
    public String getUserName() { 
     return this.userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    @Column(name="USER_RV", precision=22, scale=0) 
    public Integer getRv() { 
     return this.rv; 
    } 

    public void setRv(Integer rv) { 
     this.rv = rv; 
    } 
} 

Definición de tabla TB_USER:

CREATE TABLE "ABSOL_OWNER"."TB_USER" (
    "USER_ID" RAW(16) DEFAULT SYS_GUID(), 
    "USER_NAME" VARCHAR2(20 CHAR) NOT NULL ENABLE, 
    "USER_RV" NUMBER NOT NULL ENABLE, 
    PRIMARY KEY ("USER_ID") 
) 

Medio Ambiente:

  • Hibernate 3.3.2.GA
  • objetos
  • Ehcache 2.2.0 Servidor de base de datos
  • WebLogic 10.3.2
  • Oracle
  • almacenamiento en caché del usuario
  • Habilitado réplica de memoria caché remota RMI a través de invalidación clave
+0

Después de deshabilitar la replicación de caché RMI, el programa ya no arroja esta excepción, por lo que parece que hay algún problema con Ehcache o Hibernate. –

+0

Seguí adelante y borré mi respuesta, ya que Pascal respondió de la misma manera, y pareces haber encontrado un problema diferente. Nunca he usado la replicación de caché RMI, así que no tengo mucha ayuda para ti allí. Supongo que probablemente sea un problema en el código de replicación de RMI, en lugar de EHCache directamente. – aperkins

+0

aperkins, gracias por su intento de respuesta. Te diré la solución si recibo una respuesta de Terracotta o de la comunidad de Hibernate. –

Respuesta

5

Resulta que esta excepción se debe a un error en Hibernate. Uno de mis compañeros de equipo encontró un informe de error relacionado, Re-assembling entity from clustered JBoss Cache may fail with "argument type mismatch", que se produce al utilizar Hibernate y JBoss Cache.

Según el informe, establecer la propiedad Hibernate hibernate.cache.use_structured_entries en true evita la excepción. De acuerdo con Hibernate documentation, esta propiedad "obliga a Hibernate a almacenar datos en el caché de segundo nivel en un formato más amigable para los humanos". Aparentemente, las entradas de caché estructuradas también aseguran que Hibernate correlacione correctamente las propiedades de un objeto en el caché de segundo nivel con la propiedad correspondiente en una entidad.

Javalobby tiene un interesante article que explica cómo Hibernate usa el caché de segundo nivel.

¿Las versiones de Hibernate después de 3.3.2GA también presentan este comportamiento?

+3

Estoy teniendo el mismo problema y he intentado habilitar 'hibernate.cache.use_structured_entries' en true, pero no ayuda y estoy usando hibernate 3.6.5.Final, ¿alguna idea sobre cómo hacerlo? – Vivek

2

No creo que un NUMBER el tipo de columna se puede convertir en Integer. Pruebe un NUMBER(10,0) en su lugar.

+0

Cambiar la precisión del número no elimina este problema, por lo que creo que puede ser un problema con Ehcache o Hibernate. Probaré Hibernate 3.4.0.GA. –

+0

@Derek AFAIK, este es el tipo de columna que Hibernate generaría con el dialecto de Oracle para un entero. Puedes verificar el dialecto –

+0

Pascal, tengo columnas 'NUMBER' en otras tablas que se asignan a' Entero', pero Hibernate no arroja esta excepción para esas asignaciones. A diferencia de 'Usuario', las memorias caché para estas otras entidades no tienen habilitada la replicación de RMI. Cuando deshabilito la replicación de RMI para la memoria caché 'User', Hibernate ya no arroja esta excepción. Entonces, esta excepción puede ser un síntoma de un problema de replicación subyacente disfrazado como un problema de mapeo de tipo. –

Cuestiones relacionadas