0

私の豆はそのように見えます:

@Entity
public class Fattura {

    @Id
    Long id;

    @NotEmpty
    String numero;

    @Min(value=0)
    Double importo;

    Key<User> utente;

    // gets & sets....
}

「utente」プロパティは、私が作成した別のBeanのキーです。「Fattura」には「User」を1つだけ含めることができ、1つの「User」には多くの「Fattura」を含めることができます。

私のSpringMVCコントローラーは、Fatturaのリストの要求を管理し、それらを単純なjspで表示します。

@RequestMapping( value = "/fatture" , method = RequestMethod.GET )
    public ModelAndView leFatture() {

        ModelAndView mav = new ModelAndView("fatture");


        mav.addObject("fatture",fatturaService.listFatture());

        return mav;
    }

jspのコードは本当に単純です。テーブル内のforeachサイクルのみです。

私の質問は:

「utente」を表示するにはどうすればよいですか?

私が持っているのはそのキーだけですが、JSPで$ {fattura.utente.firstName}のようなことをしたいのですが、どうすればよいですか?

4

3 に答える 3

1

残念ながら、DAOクラスで「utente」を手動でフェッチする必要があります。TwigのようにObjectifyには自動フェッチはありません。私のPOJOには、次のフィールドがあります

@Transient private Organization sender;             // Pickup location (for client RPC)
transient private Key<Organization> senderKey;      // Pickup location (for Datastore)

データストアからエンティティをロードしてから、senderKeyを使用して組織を手動でロードします。

新しいObjectify4では、次のようにやりたいことができるようになります。

class Beastie {
   @Parent
   @Load
   ParentThing parent;

   @Id Long id;

   @Load({"bigGroup", "smallGroup"})
   SomeThing some;

   @Load("bigGroup")
   List<OtherThing> others;

   @Load
   Ref<OtherThing> refToOtherThing;

   Ref<OtherThing> anotherRef;  // this one is never fetched automatically
}

これが新しいバージョンの進化する設計ドキュメントです。

2011年11月17日の更新:これは大きなニュースです。Twigの作者であるJohnPattersonは、本日Objectifyプロジェクトに参加しました。

于 2011-11-16T07:57:07.047 に答える
1

2つのオブジェクトを手動でフェッチする必要があるのは面倒に聞こえますが、実際には、これを行うために作業と時間を2倍にしていることを知っておくと非常に便利です。各「get」呼び出しには時間がかかり、2番目の呼び出しは開始されません。最初が完了するまで。これは典型的なNoSQL環境であり、2つの別個のエンティティを持つ必要はあまりないはずです-そうする理由はありますか?

私が簡単に考えることができる理由は2つだけです。

  1. このクラスは、同じタイプの別のオブジェクトを参照します。これは、Objectifyドキュメントの例であり、人は、人でもある配偶者への参照を持っています。

  2. もう一方を埋め込んでいるクラス(この場合は「Fattura」)には、「ユーザー」をフェッチすると同時にフェッチしたくない大量のデータが含まれています。ユーザーが必要です。あなたが「Fattura」と「User」を必要とするよりもそれ自身でより頻繁に。「Fattura」が必要な場合、追加のデータストア呼び出しに値するためには、かなりの量のデータが必要になります。

于 2011-11-16T08:20:45.043 に答える
-1

オブジェクトを取得するために、必ずしも一時フィールドを使用する必要はありません。

これは機能します:

public User getUtente() {
    Objectify ofy = ObjectifyService.begin();
    return ofy.get(utenteKey); 
}

もちろん、これはゲッターが呼び出されるたびにデータストアget()を実行します。Userエンティティで@Cachedを使用することでこれを改善できるため、最初の呼び出しの後にmemcache呼び出しに変わります。Memcacheは優れていますが、セッションキャッシュを使用するともう少しうまくいくことができます。

public User getUtente() {
    Objectify ofy = myOfyProvider.get();
    return ofy.get(utenteKey); 
}

ここで重要なのは、現在のリクエスト/スレッドにバインドされ、セッションキャッシュが有効になっているObjectifyのインスタンスを(myOfyProviderを介して)提供する必要があるということです。(つまり、任意のリクエストに対して、myOfyProvider.get()はObjectifyの同じインスタンスを返す必要があります)

この設定では、ゲッターが呼び出されるたびにまったく同じUserのインスタンスがセッションキャッシュから返され、このエンティティの初期ロード以降、データストア/memcacheへのリクエストは行われません。

于 2011-11-16T09:01:51.200 に答える