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 フィールドとともに結合テーブルが DB に作成されていることがわかります。

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)

保存した後、サーバーを再起動してコメントのリストをクエリしようとすると、null 値が返されます。

私は mysql バックエンドを使用しています - db4o に切り替えると正常に動作します。

役に立つ情報があれば教えてください。

どこが間違っているのか、または同じインターフェイスを実装するさまざまなオブジェクトのコレクションを永続化するためのサンプル コードを提供できる場合は、それを歓迎します。

助けてくれてありがとう。

トム

4

2 に答える 2

0

これを指定して修正しました

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

cl私のpacakge.jdoのフィールド用。

于 2010-11-11T11:45:32.097 に答える
0

インターフェイスを使用したときに、dynamicSchemaUpdates (そのような名前の永続プロパティ) を有効にしただけで、必要に応じて FK が追加されました。ログには、私が考えるすべてのSQLが表示されます

于 2010-10-02T10:05:25.787 に答える