0

在尝试持久化具有一组接口的对象时,我遇到了错误,我想保存几个不同类型的对象。似乎几乎是随机发生的。有时重新启动后它工作正常(虽然我可能做错了什么)。

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 的每个实现类的 ID 字段。

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 后端 - 如果我切换到 db4o 它工作正常。

请让我知道是否有任何信息有用。

如果您知道我可能会出错的地方,或者可以提供一些示例代码来持久化实现相同接口的不同对象的集合,我们将不胜感激。

谢谢你的帮助。

汤姆

4

2 回答 2

0

当我使用接口时,我只是启用了 dynamicSchemaUpdates(一些具有类似名称的持久性属性),并在需要时添加了 FK。日志给出了我认为的所有 SQL

于 2010-10-02T10:05:25.787 回答
0

我通过指定解决了这个问题

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

对于cl我的 pacakge.jdo 中的字段。

于 2010-11-11T11:45:32.097 回答