现在的位置: 首页 > 综合 > 正文

Hibernate 的一个诡异的异常

2013年08月05日 ⁄ 综合 ⁄ 共 4084字 ⁄ 字号 评论关闭

两个类,Template和 Parameter: one-to-many

test代码:                
                QueryTemplate template = new QueryTemplate();
                template.setLabel("Test template label");
                template.setName("Test template name");

                     QueryEngineDAO.save(template);

            save()中代码是:  Transaction tan = session.beginTransaction();
                                                       session.save(template);
                                                      session.flush();
                                                    tan.commit();

如果Template中如果定义: private Collection queyParameters = new ArrayList(); 则报错:

Enter com.hp.dragon.util.QueryEngineDAO save() and the obj's class is: com.hp.dragon.model.QueryTemplate
Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.hp.dragon.model.TemplateParameter.id
 at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:119)
 at org.hibernate.tuple.AbstractTuplizer.getIdentifier(AbstractTuplizer.java:103)
 at org.hibernate.persister.entity.BasicEntityPersister.getIdentifier(BasicEntityPersister.java:2944)
 at org.hibernate.persister.entity.BasicEntityPersister.isTransient(BasicEntityPersister.java:2705)
 at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
 at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:409)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:82)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
 at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)
 at org.hibernate.engine.Cascades$5.cascade(Cascades.java:154)
 at org.hibernate.engine.Cascades.cascadeAssociation(Cascades.java:771)
 at org.hibernate.engine.Cascades.cascade(Cascades.java:720)
 at org.hibernate.engine.Cascades.cascade(Cascades.java:847)
 at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:332)
 at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:214)
 at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)
 at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
 at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
 at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
 at org.hibernate.impl.SessionImpl.save(SessionImpl.java:481)
 at org.hibernate.impl.SessionImpl.save(SessionImpl.java:476)
 at com.hp.dragon.util.QueryEngineDAO.save(QueryEngineDAO.java:54)
 at com.hp.dragon.test.TestTool.initQuery(TestTool.java:41)
 at com.hp.siu.collector.datastore.riss.test.TestThread.run(TestThread.java:27)
 at com.hp.dragon.test.TestRissQueryEngine.main(TestRissQueryEngine.java:17)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:105)
 ... 27 more

如果改为private Collection queyParameters-就是不要初始化这个collectiion,则OK。

mapping文件是用xdoclet生成的:

        <many-to-one
            name="templateParameters"
                    class="com.hp.dragon.model.TemplateParameter"
                    column="SEARCH_TYPE_ID"
                cascade="none"
        >

</many-to-one>

抱歉!评论已关闭.