Проблема сохранения коллекции интерфейсов в JDO / Datanucleus."невозможно назначить объект типа .." - PullRequest
0 голосов
/ 28 сентября 2010

Я получаю ошибку ниже, когда пытаюсь сохранить объект, который имеет коллекцию интерфейсов, которые я хочу содержать пару различных типов объектов. Кажется, что происходит почти случайно. Иногда после перезапуска все работает нормально (хотя я могу делать что-то не так).

class CommentList {

@Persistent
@Join
ArrayList<IComment> = new ArrayList<IComment>();

}

где-то еще ...

CommentList cl = new CommentList();

cl.addComment( new SimpleComment() );
cl.addComment( new SpecialComment() );

repo.persist( cl );

Я вижу, что таблица соединений была создана в моей БД вместе с полями идентификаторов для каждого из классов реализации IComment.

SimpleComment и SpecialComment реализуют IComment. Если я просто добавлю SimpleComment, он будет работать нормально. Как только я начинаю пытаться добавлять другие типы объектов, я начинаю получать ошибки.

ошибка, я получаю

java.lang.ClassCastException: Field "com.myapp.model.CommentList.comments" is a reference field (interface/Object) of type com.myapp.behaviours.IComment but DataNucleus is unable to assign an object of type "com.myapp.model.ShortComment" to this field. You can only assign this field to a type specified by the "implementation-classes" extension attribute.
at org.datanucleus.store.mapped.mapping.MultiMapping.setObject(MultiMapping.java:220)
at org.datanucleus.store.mapped.mapping.ReferenceMapping.setObject(ReferenceMapping.java:526)
at org.datanucleus.store.mapped.mapping.MultiMapping.setObject(MultiMapping.java:200)
at org.datanucleus.store.rdbms.scostore.BackingStoreHelper.populateElementInStatement(BackingStoreHelpe
r.java:135)
at org.datanucleus.store.rdbms.scostore.RDBMSJoinListStoreSpecialization.internalAdd(RDBMSJoinListStore
Specialization.java:443)
at org.datanucleus.store.mapped.scostore.JoinListStore.internalAdd(JoinListStore.java:233)

При сохранении, если я перезагружаю сервер и пытаюсь запросить список комментариев, я получаю нулевые возвращенные значения.

Я использую mysql backend - если я переключаюсь на db4o, он работает нормально.

Пожалуйста, дайте мне знать, если какая-либо информация будет полезна.

Если у вас есть идея, где я могу ошибаться, или вы можете предоставить пример кода для сохранения набора различных объектов, реализующих один и тот же интерфейс, который будет приветствоваться.

Спасибо за любую помощь.

Tom

Ответы [ 2 ]

0 голосов
/ 11 ноября 2010

Я исправил это, указав

<extension implemention-classes="SimpleComment SpecialComment"/>

для поля cl в моем pacakge.jdo.

0 голосов
/ 02 октября 2010

Когда я использовал интерфейсы, я просто включал dynamicSchemaUpdates (некоторые свойства постоянства с таким именем), и FK добавлялись по мере необходимости.Журнал дает все SQL, я думаю,

...