我在尝试持久化具有接口集合的对象时遇到错误,我想要保存几种不同类型的对象。似乎几乎是随机发生的。有时在重新启动后它可以正常工作(尽管我可能做错了。)
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它可以正常工作。
如果有任何信息有用,请告诉我。
如果您知道我可能出错的地方,或者可以提供一些示例代码来持久收集实现相同界面的不同对象。
感谢您的帮助。
汤姆
答案 0 :(得分:0)
当我使用接口时,我只启用了dynamicSchemaUpdates(一些具有类似名称的持久性属性),并在需要时添加了FK。日志提供了我认为的所有SQL
答案 1 :(得分:0)
我通过指定
来解决这个问题<extension implemention-classes="SimpleComment SpecialComment"/>
表示我的pacakge.jdo中的字段cl
。