休眠异常 空值已分配给基元类型 setter 的属性
在Hibernate 3.6.9中遇到了一个令人沮丧的问题。MS SQL Server 2008.请注意异常和奇数列索引引用。
HQL 查询本身:
Select r from DataStoreReference r join fetch r.container c where r.hash=:hash and r.state=0
堆栈跟踪:
2012-05-16 00:01:22,184 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - The value supplied cannot be converted to BIGINT.
2012-05-16 00:01:22,186 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - The value supplied cannot be converted to BIGINT.
2012-05-16 00:01:22,188 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - Invalid column index 14.
2012-05-16 00:01:22,190 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - The value supplied cannot be converted to BIGINT.
2012-05-16 00:01:22,193 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - The value supplied cannot be converted to BIGINT.
2012-05-16 00:01:22,194 [BackgroundDeletionThread] ERROR org.hibernate.util.JDBCExceptionReporter - Invalid column index 14.
2012-05-16 00:01:22,194 [BackgroundDeletionThread] ERROR com.flipper.utils.ServerErrorHandlerStrategy - reportError: Db :: com.flipper.datastore.workers.BackgroundDeletionThread.executeWork:87 :: EXCEPTION : com.flipper.datastore.exceptions.DBStoreException: Null value was assigned to a property of primitive type setter of com.flipper.datastore.model.DataStoreReference.usage com.flipper.datastore.exceptions.DBStoreException: Null value was assigned to a property of primitive type setter of com.flipper.datastore.model.DataStoreReference.usage
at com.flipper.datastore.impl.hib.HibernateDBStore.getAllReferences(HibernateDBStore.java:301)
at com.flipper.datastore.workers.BackgroundDeletionThread.processEntry(BackgroundDeletionThread.java:165)
at com.flipper.datastore.workers.BackgroundDeletionThread.processSet(BackgroundDeletionThread.java:138)
at com.flipper.datastore.workers.BackgroundDeletionThread.executeWork(BackgroundDeletionThread.java:84)
at com.flipper.datastore.workers.BackgroundDeletionThread.run(BackgroundDeletionThread.java:60)
Caused by: org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.flipper.datastore.model.DataStoreReference.usage
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:109)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:583)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:229)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3847)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:152)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:982)
at org.hibernate.loader.Loader.doQuery(Loader.java:857)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2542)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.flipper.message.dao.DataStoreDao.getAllReferencesByHash(DataStoreDao.java:136)
at com.flipper.datastore.impl.hib.HibernateDBStore.getAllReferences(HibernateDBStore.java:298)
... 4 more
Caused by: java.lang.IllegalArgumentException
at sun.reflect.GeneratedMethodAccessor556.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:66)
... 21 more
现在,如果以下情况不是真的,我会从逻辑(和谷歌搜索)中理解这一点。
a) DataStoreReference 的每个实例化后面都会紧跟一个 setUsage of System.currentTimeMillis) b) 该项目在映射中标记为 not-null(见下文) c) 导出的表仅在f_external列中显示 null。用法列具有完全合理的长数字。
The POJO:
数据存储引用
private long id;
private String hash;
private long date;
private long sze;
private long usage;
private int state;
private String external;
private DataStoreContainer container;
后跟通用的未修改的 getter/setter。
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flippr.datastore.model">
<class name="DataStoreReference" table="t_dsref">
<id name="id">
<column name="ds_reference_id"/>
<generator class="native"/>
</id>
<property name="hash" not-null="true" column="f_hash" lazy="false" index="idx_hash_dsr" type="string" length="128" />
<property name="state" not-null="true" column="f_state" lazy="false" index="idx_hash_dsr,idx_size_dsr,idx_usage_dsr" type="integer"/>
<!-- hibernate hates the name size -->
<property name="sze" not-null="true" column="f_size" lazy="false" index="idx_size_dsr" type="long"/>
<property name="date" not-null="true" column="f_date" lazy="false" type="long"/>
<property name="usage" not-null="true" column="f_usage" lazy="false" index="idx_usage_dsr" type="long"/>
<property name="external" not-null="false" column="f_ext" lazy="false" type="string" length="160" />
<many-to-one name="container" class="com.flipper.datastore.model.DataStoreContainer"
column="entity_id" foreign-key="fk_ds_container_id_dsr" not-found="ignore" not-null="true"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flipper.datastore.model">
<class name="DataStoreContainer" table="t_dscnt">
<id name="id">
<column name="ds_container_id"/>
<generator class="native"/>
</id>
<property name="containerType" column="f_type" index="idx_containerType_dsc" lazy="false" type="integer"/>
<property name="fileCount" column="f_fc" lazy="false" type="long"/>
<property name="deletedCount" column="f_dc" lazy="false" type="long"/>
<property name="path" column="f_path" length="255" lazy="false" type="string"/>
<set cascade="save-update,delete,delete-orphan,all-delete-orphan" inverse="true" name="documents">
<key column="entity_id" />
<one-to-many class="com.flipper.datastore.model.DataStoreReference"/>
</set>
</class>
</hibernate-mapping>