4

Entity Manager を使用して Lazy フィールドを取得するにはどうすればよいですか? ここに私のコードスニペットがあります

public class Internet implements Serializable{
      int id;
      // related fields 
      @ManyToOne (fetch=FetchType.LAZY)
      Browsers brow;
      //related public getters and setters.
 }

これは私の Browser Hibernate クラスです。

public class Browser implements Serializable{

  int id;
  String name;
  //and some other useful fields. 

  //here public getters and setters.
  public String getName(){
     return name; 
  }

  public void setName(String name){
     this.name = name
  }
  //and few more.
}

私の要件は、Internet.id を使用して EntityManger の find メソッドを使用して Browser のインスタンスを取得するときに、ブラウザーの名前が必要であるということです。

これら 2 つのクラスは、異なるパッケージに含まれています。だから私は browser.name に直接アクセスできません。ブラウザの名前が欲しいです。プログラムをデバッグすると、browser.name が null になっています。EntityManager を使用して browser.name の値を取得する方法はありますか。

この質問に関連する投稿をいくつか読みましたが、何の手がかりも得られませんでした。どんな体でも私を助けることができますか?

これは私のページといくつかのことを使用している私のコードです:

InternateObjectUsingPage usingPage = (InternateObjectUsingPage)pageWithName(InternateObjectUsingPage.class.getName());
    _em = EntityManager.createEntityManager();
    Internet ipReg = _em.find(Internet.class, _currentRow.getIpRegId()) ; // _currentRow.getInRegId() is id. 
    ipReg.getBrowser(); // recently i added as per the suggestion.
    if(ipReg != null){
        _refresh = true;
        usingPage.setInternet(ipReg);
        return usingPage;
    }
    _em.close();

それが私のコードの使用方法ですが、違いはわかりませんでした。

4

2 に答える 2

0

Internetオブジェクトを照会するメソッドでこれを試すことができます。internet.getBrowser()その時点でそれをロードするために呼び出します。

Internet internet = 
  (Internet) query.getSingleResult(); // or the way you fetch via EM
internet.getBrowser();

または、オブジェクトのリストを照会する場合:

List<Internet> internetList = 
  (List<Internet>) query.getSingleResult();  // or the way you fetch via EM
for(Internet internet: internetList){     
    internet.getBrowser();
}

ロードするたびFetchType.EAGERにロードしたくないと指定したと思います。BrowserInternet

于 2012-09-21T16:10:28.527 に答える
0

em 変数で使用している EntityManager インスタンスと、id で使用するインターネット オブジェクトの id があると仮定すると、呼び出している最初のページのある時点で次のように検索されると仮定します。

Internet internet = em.find(Internet.class, id);

同じメソッドの次のコード行で、次のようにします。

internet.getBrowser();

結果に対して何もする必要はありません。.find 呼び出しと同じトランザクション コンテキストでメソッドを呼び出すだけです。プロパティをトリガーすると、EntityManager がフィールドをロードします。次に、インターネット オブジェクトをどこにでも渡し、brow プロパティが null 以外であることを期待できます。

于 2012-09-21T17:38:32.093 に答える