Wie kann ich heilen, die Ursache von Hibernate exception "IllegalArgumentException aufgetreten beim Aufruf von setter"?
Wie kann ich heilen die Ursache der gelegentlichen Ausnahme IllegalArgumentException occurred while calling setter
dass Hibernate wirft, wenn mein Programm versucht zu laden, Benutzer durch Namen aus der Datenbank?
Bin ich falsch Spalte Zuordnung USER_RV
in Tabelle User
Klasse Integer
statt BigDecimal
oder eine andere integer-Typ? Beachten Sie, dass die gleiche Anwendung maps NUMBER
Spalten in anderen Tabellen zu Integer
Objekte, aber Hibernate nicht werfen diese exception beim füllen eines Objekts mit einer Reihe von Tabellen.
Ist weiter zu beachten, dass das Programm ermöglicht RMI-cache-Replikation für die Benutzer-cache nur. Könnte diese Ausnahme werden im Zusammenhang mit cache-Replikation? Ist es ein bug in Ehcache oder 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: java.lang.ClassCastException@6be0d6
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
Definition der Klasse 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;
}
}
Definition der Tabelle 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")
)
Umgebung:
- Hibernate 3.3.2.GA
- Ehcache 2.2.0
- WebLogic Server 10.3.2
- Oracle-Datenbank
- Caching Benutzer Objekte
- Aktiviert RMI-cache-Replikation über remote-key-Aufhebungs -
- Nach dem deaktivieren der RMI-cache-Replikation, wird das Programm nicht mehr wirft diese Ausnahme, so scheint es, dass es einige Problem mit Ehcache oder Ruhezustand.
- Ich ging vor und löschte meine Antwort, als Pascal antwortete ihm in der gleichen Weise, und Sie scheint gefunden zu haben, ist ein anderes problem. Ich habe noch nie verwendet die RMI-cache-Replikation, so dass ich nicht viel Hilfe für Sie gibt. Ich würde vermuten, es liegt wahrscheinlich ein problem in der RMI-Replikation code, anstatt EHCache direkt.
- aperkins, danke für deinen Antwort-Versuch. Wird Sie wissen lassen, die Lösung sollte ich hören, wieder aus Terrakotta oder die Hibernate-community.
- Ich habe diese Frage zum Hibernate-User-Forum auf forum.hibernate.org/viewtopic.php?f=1&t=1006842&start=0 und die Ehcache-Anwender-mailing-Liste unter lists.terracotta.org/pipermail/ehcache-list/2010-September/....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, dass diese Ausnahme ist aufgrund von einen bug in Hibernate. Einer meiner Kameraden fand eine zugehörige bug-report, Re-Montage Einheit von geclusterten JBoss-Cache schlägt fehl mit "argument type mismatch", das Auftritt, wenn mithilfe von Hibernate und JBoss Cache.
Laut dem Bericht die Einstellung der Hibernate-Eigenschaft
hibernate.cache.use_structured_entries
zu wahr vermeidet die Ausnahme. Nach dem Hibernate Dokumentation, diese Eigenschaft "Kräfte, die Hibernate zum speichern der Daten in der second-level-cache in einem mehr menschlich-freundlichen format". Offenbar, strukturierte cache-Einträge auch dafür sorgen, dass Hibernate richtig Karten Eigenschaften eines Objekts in der second-level-cache, um die entsprechende Eigenschaft in einer Person.Javalobby hat eine interessante Artikel, die erklärt, wie Hibernate verwendet den second-level-cache.
Tun-Versionen von Hibernate nach 3.3.2 GA weisen auch dieses Verhalten?
Ich glaube nicht, dass ein
NUMBER
Spalte Typ umgewandelt werden kann in einInteger
. Versuchen Sie eineNUMBER(10,0)
statt.NUMBER
Spalten in anderen Tabellen anzeigen zuInteger
, aber Hibernate nicht werfen dieser Ausnahme für diese Zuordnungen. Im Gegensatz zumUser
, die caches für diese anderen Entitäten nicht über RMI-Replikation aktiviert ist. Wenn ich das deaktivieren der RMI-Replikation für dieUser
cache, Hibernate nicht mehr wirft diese exception. So, diese Ausnahme kann ein symptom einer zugrunde liegenden Replikations-problem sich als eine Art mapping-problem.