oracle 如何解决 Hibernate 异常“调用 setter 时发生 IllegalArgumentException”的原因?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3631349/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I cure the cause of Hibernate exception "IllegalArgumentException occurred while calling setter"?
提问by Derek Mahar
How do I cure the cause of the occasional exception IllegalArgumentException occurred while calling setter
that Hibernate throws when my program attempts to load a user by name from the database?
IllegalArgumentException occurred while calling setter
当我的程序尝试从数据库中按名称加载用户时,如何解决Hibernate偶尔抛出异常的原因?
Am I incorrectly mapping column USER_RV
in table User
to class Integer
instead of BigDecimal
or some other integer type? Note that the same application maps NUMBER
columns in other tables to Integer
objects, but Hibernate does notthrow this exception when populating an object with a row from those tables.
我是否错误地将USER_RV
表中的列映射User
到类Integer
而不是BigDecimal
其他整数类型?请注意,同一个应用程序将NUMBER
其他表中的列映射到Integer
对象,但在使用这些表中的行填充对象时,Hibernate不会抛出此异常。
Further note that the program enables RMI cache replicationfor the User cache only. Might this exception be related to cache replication? Is it a bug in Ehcache or Hibernate?
进一步注意,该程序只为用户缓存启用RMI 缓存复制。这个异常可能与缓存复制有关吗?它是 Ehcache 或 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.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 of class User
:
类的定义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 of table TB_USER
:
表的定义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")
)
Environment:
环境:
- Hibernate 3.3.2.GA
- Ehcache 2.2.0
- WebLogic Server 10.3.2
- Oracle database
- Caching User objects
- Enabled RMI cache replication via remote key invalidation
- 休眠 3.3.2.GA
- Ehcache 2.2.0
- 网络逻辑服务器 10.3.2
- 甲骨文数据库
- 缓存用户对象
- 通过远程密钥失效启用 RMI 缓存复制
采纳答案by Derek Mahar
It turns out that this exception is due to a bug in Hibernate. One of my teammates found a related bug report, Re-assembling entity from clustered JBoss Cache may fail with "argument type mismatch", that occurs when using Hibernate and JBoss Cache.
事实证明,这个异常是由于 Hibernate 中的一个错误造成的。我的一个队友发现了一个相关的错误报告,Re-assembled entity from clustered JBoss Cache 可能会因“参数类型不匹配”而失败,这是在使用 Hibernate 和JBoss Cache时发生的。
According to the report, setting Hibernate property hibernate.cache.use_structured_entries
to trueavoids the exception. According to the Hibernate documentation, this property "forces Hibernate to store data in the second-level cache in a more human-friendly format". Apparently, structured cache entries also ensure that Hibernate correctly maps properties of an object in the second-level cache to the corresponding property in an entity.
根据报告,将 Hibernate 属性设置hibernate.cache.use_structured_entries
为true可以避免异常。根据 Hibernate文档,此属性“强制 Hibernate 以更人性化的格式将数据存储在二级缓存中”。显然,结构化缓存条目还确保 Hibernate 将二级缓存中对象的属性正确映射到实体中的相应属性。
Javalobbyhas an interesting articlethat explains how Hibernate uses the second-level cache.
Javalobby有一篇有趣的文章,解释了 Hibernate 如何使用二级缓存。
Do versions of Hibernate after 3.3.2GA also exhibit this behaviour?
3.3.2GA 之后的 Hibernate 版本是否也表现出这种行为?
回答by Pascal Thivent
I don't think that a NUMBER
column type can be cast into an Integer
. Try a NUMBER(10,0)
instead.
我不认为可以将NUMBER
列类型转换为Integer
. 换一个试试NUMBER(10,0)
。