0

私は現在 Play! を使用しています。2.0.4 で Ebean と Jackson を使用。User と Contact の間に OneToMany の関係があります。Jacksons ObjectMapper を使用してオブジェクトを json に変換していますが、変換中に循環参照の問題が発生しています。

class User extends Model {
    List<Contact> contacts;
}

class Contact extends Model {
    User user;
}

すべての連絡先のリストを取得し、このリストをユーザーにリンクする外部キーを含む json に変換したいのですが、ユーザー テーブル自体からのデータは必要ありません。

現時点では、ObjectMapper を使用してこのリストを作成すると、StackOverflowError が発生します。理由はわかりますが、最善の解決方法がわかりません。

関連がないと思われる注釈やコードは省略しましたが、さらにコードが必要な場合はお知らせください。

4

2 に答える 2

2

私は Play フレームワークを使用していませんが、JPA を使用すると、あるエンティティから別のエンティティに OneToMany または ManyToMany の関係をマップできます。次に、2 番目のエンティティでは、同じ関係を逆方向に読み取るため、関係は 1 つだけになります。あなたの問題は、2 つの関係があり、一方が一方通行になっているようです。

User クラスの連絡先メンバーの @OneToMany(mappedBy="user") に相当する Play eBean を探します。

于 2012-11-09T22:05:37.577 に答える
0

おそらく、リスト o 結果をフェッチし、それを繰り返し、必要なデータのみを含む新しいリストを作成する必要があります。ObjectMapper についてはわかりませんが、同様の問題があり、 toJson() メソッドがすべての関係を持つオブジェクト全体を強制的に構築したようです。

その質問以来、私はいくつかの JSON API を構築し、その経験を思い出して、行ごとに新しいオブジェクトを手動で構築することにしました。私の API の中には大きなデータセットを返すことができる (すべき) ものがあるため、冗長な (使用されていない) フィールドなどを使わずに、慎重にデータを選択することが重要でした。このような

public static Result jsonAll(){

    // initiate empty result List
    List results = new ArrayList();

    List<Marker> tasks = Marker.find.select("id, name").findList();
    for (Marker task : tasks) {

        // build 'item'
        Map<String, Object> item = new HashMap<String, Object>();
        item.put("id", task.id);
        item.put("name", task.name);

        // add the 'item' to 'results'
        results.add(item);

    }

    // return all as JSON
    return ok(Json.toJson(results));
}

もちろん、リレーションを取得する必要があるため、ファインダにfetch()ステートメントを追加し、正確なリレーションと選択するフィールドを指定する必要があります。

于 2012-11-09T22:18:34.777 に答える