1

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>

私は他の場所で助けを見つけることができませんでしたが、質問は以前に尋ねられた可能性があります. その場合、簡単なポインタをいただければ幸いです。

4

1 に答える 1

2

実装がこれをサポートする必要があると JDO が定義しているということですか? 答え : いいえ。JDO は有効な PK タイプを定義します。「P」とは何ですか? クラスに関する限り、これは Object です (つまり、(java.lang.)Object には実際の型がないため)。JPAもそれについて定義していません。

于 2012-07-26T06:28:30.653 に答える