0

HibernateセッションからプルするUserオブジェクトがあります。Userオブジェクトには、私が取得してJSONに変換しているCarオブジェクトのセットがあります。問題は、JSONに変換するためにSetを返すと、休止状態のセッションがまだアクティブであるために、解析の無限ループに入っているように見えることです。

コードは次のようになります。

        public Set<Car> getUserCurrentCar(User user) {
                user = (User) session.get(User.class, user.getId());
            Set<Car> retrievedCars = (Set<Car>) user.getCars();
            session.close();
            return retrievedCars;
        }

ただし、セッションなしでオブジェクト値をオブジェクトに移動すると、すべてがエラーなしで正常に解析されます。

public Set<Car> getUserCurrentCar(User user) {
            user = (User) session.get(User.class, user.getId());
        Set<Car> Cars = new HashSet<Car>();
        Set<Car> retrievedCars = (Set<Car>) user.getCars();

        for(Car Car :retrievedCars){
        Car newCar = new Car();
        newCar.setTitle(car.getTitle());
        cars.add(newCar);
        }
        session.close();
        return cars;
    }

これは機能しますが、将来的にはオブジェクトを変更し、繰り返しのように見えるオブジェクトの転送をすべて回避したいと思います。

さらに、私のCarオブジェクトには、休止状態のマッピングでUserへの多対1の後方参照があります。

<many-to-one name="user" 
    column="userId"
    not-null="true"/>

どうすればこれを回避し、真に分離されたオブジェクトを使用してJSONに解析できますか?

4

2 に答える 2

1

あなたが抱えている問題は、Hibernate セッションとは関係ありません。むしろ、JSON フレームワークで循環参照のシリアル化に問題が発生し、スタック オーバーフローが発生しています。解決策の 1 つは、Restlet フレームワークでJackson 拡張機能を有効にし、 JacksonRepresentationを使用してオブジェクトをシリアル化することです。Jackson を有効にすると、以下に示す方法でオブジェクトに注釈を付けることができ、循環参照がより適切に処理されます。

public class User implements Serializable {
    public static final String REFERENCE_CARS = "user.cars";

    private Set<Car> cars;

    // constructors, etc

    @JsonManagedReference(REFERENCE_CARS)
    public Set<Car> getCars() {
        return cars;
    }
}

public class Car implements Serializable {
    private User user;

    // constructors, etc

    @JsonBackReference(User.REFERENCE_CARS)
    public User getUser() {
        return user;
    }
}

Userはこの関係の所有側であるため、そこに含まれるすべての車は JSON でシリアル化されることに注意してください。一方、Carはリレーションシップの所有側であるため、Userオブジェクトは* その JSON に表示されません。

于 2012-12-20T06:11:35.163 に答える
0

私の質問で述べたように、hibernte からオブジェクトを単純にプルして JSON に変換したかったのです。Car オブジェクトには、ネストされたオブジェクトに User オブジェクトへの後方参照があったため、Restlets や google GSON などの JSON フレームワークは無限ループに陥りました。

私はそれを避けたかったのですが、休止状態からオブジェクトをプルする必要があり、その後、オブジェクトを手動でループし、新しく作成されたオブジェクトに必要なものを正確に入力しました。

これにより、将来、これらのオブジェクトの値が変更されたときにメンテナンス作業が発生しますが、最終的には機能します。

答え: 休止状態からオブジェクトをプルします。別の Java オブジェクトを作成します。オブジェクトをループし、新しく作成されたオブジェクトに休止状態のオブジェクト値を入力します。

于 2013-01-04T22:17:32.523 に答える