1

現在、GWT、GAE、JPA を ORM として使用しています。GAE が生成しているキーが大きすぎて、RequestFactory を使用してモバイル デバイスで使用できないという問題があります。小さいリストのデータ量は、文字列に変換したときの ID/KEY のサイズのために圧倒的です。

継承を処理できるように、キーに String を使用しています。

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")  
  protected String key;

これにより、非常に長い例 "agxzbWFydGJhcnNpdGVyFAsSDUVzdGFibGlzaG1lbnQYuAIM" であるキーが作成され、キーにオブジェクト タイプと親を格納するために大きくなります。

より小さな一意の ID を作成する方法が必要ですが、GAE で継承を処理する機能はまだあります。@Id/key として Long を試しましたが、String/Key キーに組み込まれている関係のために、オブジェクトで @OneToMany 関係を使用できませんでした。

もう 1 つのオプションは、クラスごとにシーケンスを作成し、その ID に Long プロパティを使用することです。以下に例を示しますが、アプリ エンジンで生成された長いシーケンスを処理する方法がわかりません。

@GeneratedValue プライベート ロングフレンドリー クラス固有キー。

アドバイスをいただければ幸いです。各クラスタイプのシーケンスを使用する以外に別のオプションがある場合は興味がありますが、そうでない場合は、特定のクラスのシーケンス (@ID ではない) を作成する例はありますか?

4

1 に答える 1

0

小さいキーに適したソリューションを思いつきました。これをきれいに行う最善の方法は、所有されていない関係でアプリエンジンに jpa/jdo 2 を使用することだと思います。このようにして、型だけを使用して (Long) id からキーを取得でき、親関係を使用する必要はありません。

これはベース データストア オブジェクトであり、アプリ エンジン キーを使用していることに注意してください。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class DatastoreObject {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Key key;

  public Long getId() {
    return key.getId();
  }

}

このクラスは、jpa 2 でサポートされている @Unowned 属性を使用して、インベントリのキーに親施設キーが含まれないようにします。それ以外の場合は、親 ID も渡し、それをタイプに基づいてキーに解決する必要があります。これは、所有関係では子キーに親キーも含まれているためです。

@Entity
public class Establishment extends DatastoreObject {

    @Unowned
    @OneToOne(cascade = CascadeType.ALL)
    private Inventory inventory;

}

次に、dao基本クラスでクラスを使用します

public class DaoBase<T extends DatastoreObject> {

protected Class<T> clazz;

    @SuppressWarnings("unchecked")
    public DaoBase() {
        clazz = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
    }


    /**
     * Find an object by it's shortened long id
     * @param id
     * @return
     * @throws EntityNotFoundException
     */
    public T find(Long id) {
        if (id == null) {
            return null;
        }
        EntityManager em = ThreadLocalPersistenceManager.getEntityManager();

        Key key = getKey(id);

        T obj = em.find(clazz, key);
        return obj;
    }

    protected Key getKey(Long id) {
        return KeyFactory.createKey(clazz.getSimpleName(), id);
    }
}
于 2012-08-18T18:13:35.347 に答える