hibernate "IllegalArgumentException произошел вызов вызывающего" - PullRequest
1 голос
/ 02 августа 2010

Вот моя иерархия классов (конструкторы / геттеры, сгенерированные lombok для краткости опущены):

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;
}

Проблема в том, что когда я сохраняю новый экземпляр A, который имеет материал в bSet, я получаю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

Может кто-нибудь сказать мне, что происходит?

Спасибо!

1 Ответ

1 голос
/ 03 августа 2010

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...