簡體   English   中英

休眠“發生IllegalArgumentException調用getter”

[英]hibernate “IllegalArgumentException occurred calling getter”

這是我的類層次結構(為簡潔起見,省略了lombok生成的構造函數/ getters / setter):

public class A
{
    ... other variables ...

    @OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
    private Set<B> bSet = new HashSet<B>();
}

public class B
{
    ... other variables ...

    @CollectionOfElements
    @IndexColumn(name="index")
    private List<C> cList = new ArrayList<C>();
}

public class C
{
    ... other variables ...

    @Embedded
    private D[] dArray;
}

@Embeddable
public class D
{
    ... other variables ...

    private float f1;

    private float f2;
}

問題是,當我保存bSet中包含內容的新A實例時,會收到IllegalArgumentException。 這是堆棧跟蹤的相關部分:

 org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of path.to.D.f1
    at path.to.dao.commitTransaction(PersistableDAO.java:32)
    at path.to.daoCaller(daoCaller.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    ... omitted for brevity ...
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of path.to.D.f1
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:195)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:87)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:93)
    at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:109)
    at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:376)
    at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:419)
    at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:421)
    at org.hibernate.collection.PersistentList.getSnapshot(PersistentList.java:61)
    at org.hibernate.engine.CollectionEntry.<init>(CollectionEntry.java:91)
    at org.hibernate.engine.StatefulPersistenceContext.addCollection(StatefulPersistenceContext.java:807)
    at org.hibernate.engine.StatefulPersistenceContext.addNewCollection(StatefulPersistenceContext.java:774)
    at org.hibernate.event.def.WrapVisitor.processArrayOrNewCollection(WrapVisitor.java:108)
    at org.hibernate.event.def.WrapVisitor.processCollection(WrapVisitor.java:74)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:124)
    at org.hibernate.event.def.WrapVisitor.processValue(WrapVisitor.java:121)
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:78)
    at org.hibernate.event.def.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:394)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:296)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:320)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:266)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:243)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:479)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:357)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:320)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:266)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:243)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at path.to.dao.commitTransaction(PersistableDAO.java:28)
    ... 52 more
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:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169)
    ... 113 more

誰能告訴我怎么回事?

謝謝!

AFAIK,您無法持久保存Embeddable數組。 換句話說,不支持以下內容:

public class C {
    ... other variables ...

    @Embedded
    private D[] dArray;
}

根據JPA 1.0規范:

2.1.5可嵌入類

實體可以使用其他細粒度的類來表示實體狀態。 與實體實例本身不同,這些類的實例不具有持久身份。 相反,它們僅作為它們所屬實體的嵌入式對象存在。 此類嵌入式對象嚴格屬於它們自己的實體,並且不能在持久實體之間共享。 嘗試在實體之間共享嵌入式對象具有未定義的語義。 由於這些對象沒有持久性標識,因此通常將它們與它們所屬的實體實例一起映射

可嵌入類必須遵守第2.1節中針對實體的要求,但可嵌入類未標注為Entity 可嵌入類必須被注釋為Embeddable或在XML描述符中這樣表示。 嵌入對象的訪問類型由嵌入對象的實體的訪問類型確定。 本規范僅要求支持一種嵌入級別。

有關可嵌入類的其他要求,請參見第9.1.34節。

JPA 2.0添加了對嵌入式對象集合的支持:

2.6可嵌入類和基本類型的集合

實體或可嵌入類的持久字段或屬性可以對應於基本類型或可嵌入類的集合(“元素集合”)。 當此類收集由ElementCollection注釋指定時,將通過第11.1.8節中定義的收集表進行映射。 如果未為集合值的字段或屬性指定ElementCollection批注(或XML等效項),則適用第2.8節的規則。

元素集合中包含的可嵌入類(包括另一個可嵌入類中的可嵌入類)不得包含元素集合,也不得包含與多對一或一對一之外的實體的關系關系。 可嵌入類必須在這種關系的擁有方,並且該關系必須通過外鍵映射進行映射。 (請參閱第2.9節。)

但是我仍然認為您不能映射一系列Embeddable。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM