DataNucleus を使用して、抽象基本クラスを使用してサブクラスに「長い」ID を提供することに満足しています (プリミティブ型に注意してください)。
JPAの例を採用するときに、基本クラスをパラメーター化するというアイデアを思いつきました。その目的は、String などのさまざまな ID タイプをサポートすることでした。
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUBCLASS_TABLE)
@Version(strategy=VersionStrategy.VERSION_NUMBER, column="jdo_version")
public abstract class VersionedIdEntity<P>
implements Serializable {
static final long serialVersionUID = 1L;
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
private P id;
public P getId() {
return id;
}
}
ジェネリックにより、ラップされた Java 型「Long」を使用するようになったため、サブクラスは次のように宣言されました。
public class Account extends VersionedIdEntity<Long>
新しい基本クラスへの切り替えにより、「java.lang.Object」の実装が見つからないというエラーが発生しました。
org.datanucleus.exceptions.NucleusUserException: フィールド "VersionedIdEntity.id" は参照型 (インターフェイス/オブジェクト) として宣言されていますが、"java.lang.Object" の実装クラスが見つかりません!
エラーは型消去に関連していますか?
追加の質問は、(1)JPAがそれをどのように処理するか、および(2)型 P をDataNucleusで永続化可能な型に制限できるかどうかです。
<? extends PersistableType>
私は他の場所で助けを見つけることができませんでしたが、質問は以前に尋ねられた可能性があります. その場合、簡単なポインタをいただければ幸いです。