2

Play! を使ってアプリを開発しています。フレームワーク 2.1.3、モデル レイヤーに EBean を使用して、部分オブジェクト クエリを実行し、結果をユーザーに返す準備として JSON にシリアル化するときに、選択されていないプロパティをオンデマンドで遅延ロードしないようにしたいと考えています。

AutoFetch を false に設定しようとしましたが、JSON にシリアル化する前にトランザクションを終了しようとしました (最終的に Transaction is Inactive エラーが発生しました)。また@Lazy(false)、モデル クラスに注釈を追加しました。

同じメモで、1対多の関連付けもあり、その最初の3行をクエリしたいのnew FetchConfig().queryFirst(2)ですが、同じ遅延読み込みの問題のために、関連する関連付け行全体を取得することになります。

マニュアルを見て、これを読みました(EBean Partial Objects):

部分オブジェクトは、それが持っていないプロパティを取得または設定すると、オンデマンドで残りのデータを遅延ロードします。

これを回避する方法はありますか?

4

2 に答える 2

1

2 つの選択肢があります。

オプション 1)内部で Jackson コアを使用する Ebean の組み込み JSON サポートを使用します。Ebean の JsonContext から利用できる多くのライター オプションがあります。

クエリと JSON の両方に適用される PathProperties を使用した例。

PathProperties pathProperties =
        PathProperties.parse("(id,status,name,shippingAddress(id,line1,city),billingAddress(*),contacts(*))");

List<Customer> customers = Ebean.find(Customer.class)
    .apply(pathProperties)
    .findList();

String jsonString = Ebean.json().toJson(customers, pathProperties);

オプション 2)はバージョン 6.2.2 で新しく利用可能になった機能で、クエリで DisableLazyLoading(true) を設定できます。

参考:https ://github.com/ebean-orm/avaje-ebeanorm/issues/360

于 2015-07-29T23:50:11.137 に答える
0

この問題は、遅延読み込みを行わないようにする必要があるクエリを使用Statementsして、標準の JDBC インターフェイスを使用することで解決しました。ResultSets

余談ですが、Scala の場合、直接フィールド アクセスは遅延読み込みを使用しないことがわかりましたが、残念ながら、それは私のアプリケーションで使用している言語ではありません。

于 2013-08-25T06:54:51.117 に答える