我正在使用hibernate來處理數據庫事務。我是休眠的新手。Hibernate:java.lang.IllegalArgumentException:對象不是聲明類的實例
我不得不實體:
- AttributeEntity
- TaxonomyEntity
AttributeEntity可以有一個或多個taxonomyEntities。
AttributeEntity約束:
- 屬性Id是主鍵
- attributeCd是獨特
TaxonomyEntity約束:
- taxonomyId是主鍵
- attributeCd是外鍵表中「屬性」
什麼是我想要做什麼?
創建這兩個實體之間的關係,以便如果我可以創建/刪除整個樹結構(Attribue及其分類法)。像attributeEntity.save()或attributeEntity.delete()
問題:
用下面的測試中,當我試圖挽救attributeEntity,休眠保存數據。但是當使用taxonomyEntity列表作爲AttributeEntity的一部分時,我看到下面描述的錯誤。 我可以得到有關錯誤原因的任何見解嗎?
我AttributeEntity類:
package com.myplace.online.attribute.api.entities;
import java.io.Serializable;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
@Entity
@SequenceGenerator(name = "attribute_seq", sequenceName = "OAP_META_NEW.ATTRIBUTE_SEQ")
@Table(name = "ATTRIBUTE", schema = "OAP_META_NEW")
public class AttributeEntity implements Serializable
{
private int attributeId;
private Integer attributeCategoryId;
private String attributeName;
private String attributeCd;
private List<TaxonomyEntity> taxonomyEntities;
@Id
@Column(name = "ATTRIBUTE_ID", nullable = false, unique = true)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "attribute_seq")
public int getAttributeId()
{
return attributeId;
}
public void setAttributeId(int attributeId)
{
this.attributeId = attributeId;
}
@Basic
@Column(name = "ATTRIBUTE_CATEGORY_ID", nullable = false, precision = 0)
@JoinColumn(name = "ATTRIBUTE_CATEGORY_ID", referencedColumnName = "ATTRIBUTE_CATEGORY_ID")
public Integer getAttributeCategoryId()
{
return attributeCategoryId;
}
public void setAttributeCategoryId(Integer attributeCategoryId)
{
this.attributeCategoryId = attributeCategoryId;
}
@Basic
@Column(name = "ATTRIBUTE_NAME", nullable = false, length = 70)
public String getAttributeName()
{
return attributeName;
}
public void setAttributeName(String attributeName)
{
this.attributeName = attributeName;
}
@Basic
@Column(name = "ATTRIBUTE_CD", nullable = false, length = 6)
public String getAttributeCd()
{
return attributeCd;
}
public void setAttributeCd(String attributeCd)
{
this.attributeCd = attributeCd;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "ATTRIBUTE_CD", referencedColumnName = "ATTRIBUTE_CD", nullable = false)
public List<TaxonomyEntity> getTaxonomyEntities()
{
return taxonomyEntities;
}
public void setTaxonomyEntities(List<TaxonomyEntity> taxonomyEntities)
{
this.taxonomyEntities = taxonomyEntities;
}
}
我TaxonomyEntity類
package com.myplace.online.attribute.api.entities;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;
@Entity
@SequenceGenerator(name = "taxonomy_seq", sequenceName = "OAP_META_NEW.TAXONOMY_SEQ")
@Table(name = "TAXONOMY", schema = "OAP_META_NEW")
public class TaxonomyEntity implements Serializable
{
private int taxonomyId;
private String attributeCd;
private String taxonomyCategory;
private String taxonomySubcategory;
private String taxonomyAttributeName;
@Id
@Column(name = "TAXONOMY_ID", nullable = false, unique = true)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "taxonomy_seq")
public int getTaxonomyId()
{
return taxonomyId;
}
public void setTaxonomyId(int taxonomyId)
{
this.taxonomyId = taxonomyId;
}
@Basic
@Column(name = "ATTRIBUTE_CD", length = 6, nullable = false, insertable = false ,updatable = false)
public String getAttributeCd()
{
return attributeCd;
}
public void setAttributeCd(String attributeCd)
{
this.attributeCd = attributeCd;
}
@Basic
@Column(name = "TAXONOMY_CATEGORY", nullable = true, length = 100)
public String getTaxonomyCategory()
{
return taxonomyCategory;
}
public void setTaxonomyCategory(String taxonomyCategory)
{
this.taxonomyCategory = taxonomyCategory;
}
@Basic
@Column(name = "TAXONOMY_SUBCATEGORY", nullable = true, length = 100)
public String getTaxonomySubcategory()
{
return taxonomySubcategory;
}
public void setTaxonomySubcategory(String taxonomySubcategory)
{
this.taxonomySubcategory = taxonomySubcategory;
}
@Basic
@Column(name = "TAXONOMY_ATTRIBUTE_NAME", nullable = false, length = 100)
public String getTaxonomyAttributeName()
{
return taxonomyAttributeName;
}
public void setTaxonomyAttributeName(String taxonomyAttributeName)
{
this.taxonomyAttributeName = taxonomyAttributeName;
}
}
這是我想測試方式:
//create attribute
attributeEntity = new AttributeEntity();
attributeEntity.setAttributeCategoryId(0);
attributeEntity.setAttributeCd("E_TEST");
attributeEntity.setAttributeId(0);
attributeEntity.setAttributeName("TEST_ATTRIBUTE");
//Create Taxomony
taxonomyEntity = new TaxonomyEntity();
// taxonomyEntity.setTaxonomyId(0); -- expecting this to be created by the sequence
taxonomyEntity.setDescription("A test taxonomy");
taxonomyEntity.setTaxonomyCategory("123123123CategoryTest");
taxonomyEntity.setTaxonomySubcategory("123123123SubcategoryTest");
// taxonomyEntity.setAttributeCd(attributeEntity.getAttributeCd()); -- Expecting this to be created from AttributeEntity
taxonomyEntity.setTaxonomyAttributeName("TEST_TAXONOMY_ATTRIBUTE");
List<TaxonomyEntity> taxonomyList = new ArrayList<TaxonomyEntity>();
taxonomyList.add(taxonomyEntity);
attributeEntity.setTaxonomyEntities(taxonomyList);
attributeService = context.getBean(AttributeService.class);
attributeService.saveAttributeEntity(attributeEntity);
這是我看到的錯誤:發生
- 拋出:IllegalArgumentException調用com.myplace.online.attribute.api.entities.AttributeEntity.attributeCd 的吸氣
,然後接近尾聲:因通過:java.lang。拋出:IllegalArgumentException:對象不是事先聲明類
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.myplace.online.attribute.api.entities.AttributeEntity.attributeCd at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:192) at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:76) at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:82) at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:107) at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:433) at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:421) at org.hibernate.event.internal.WrapVisitor.processComponent(WrapVisitor.java:135) at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:127) at org.hibernate.event.internal.WrapVisitor.processValue(WrapVisitor.java:125) at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76) at org.hibernate.event.internal.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:372) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:273) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684) at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676) at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235) at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350) at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293) at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379) at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:319) at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296) at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118) at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:460) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:294) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) at com.myplace.online.attribute.api.dao.GenericDAOImpl.save(GenericDAOImpl.java:85) at com.myplace.online.attribute.api.services.AttributeServiceImpl.saveAttributeEntity(AttributeServiceImpl.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) at com.sun.proxy.$Proxy39.saveAttributeEntity(Unknown Source) at com.myplace.online.attribute.api.TaxonomyTest.setUpEntity(TaxonomyTest.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138) at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198) at org.testng.TestNG.runSuitesLocally(TestNG.java:1123) at org.testng.TestNG.run(TestNG.java:1031) at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:124) **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(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
感謝的一個實例。