繁体   English   中英

将休眠对象转换为json时出现stackoverflow错误

[英]stackoverflow error when converting hibernate object to json

我有一个具有以下休眠映射的用户对象,该映射是多对多自连接:

    <hibernate-mapping>
        <class name="User" table="User">
            <id name="id" type="int">
            <column name="userId" />
                <generator class="native" />
            </id>
            <set name="friends" table="User_Friend" 
                    inverse="false" lazy="true" cascade="all">
                <key column="userId"/>
                <many-to-many column="friendId" class="User" />
            </set>
            <set name="cars" table="Car" inverse="true" fetch="select" lazy="true">
            <key>
                <column name="userId" not-null="true" />
            </key>
            <one-to-many class="Car" />
        </set>
        </class>
    </hibernate-mapping>

汽车映射如下所示:

<hibernate-mapping>
    <class name="Car" table="Car">
        <id name="id" type="int">
            <column name="carId" />
            <generator class="native" />
        </id>
        <set name="carStatuses" table="Car_Status" 
                inverse="true" lazy="true" fetch="select">
            <key>
                <column name="carId" not-null="true" />
            </key>
            <one-to-many class="CarStatus" />
        </set>
        <many-to-one name="user" 
        column="userId"
        not-null="true"/>

    </class>
</hibernate-mapping>

我检索用户对象,然后尝试使用此方法将其作为Restlet JSON表示形式返回:

public Representation getJSONRepresentationFromObject(User object) {


    JSONArray ja = new JSONArray();
    JSONObject jo = new JSONObject(object);

    ja.put(jo);

    JsonRepresentation jr = new JsonRepresentation(ja);
    jr.setCharacterSet(CharacterSet.UTF_8);

    return jr;
}

问题是我得到一个StackOverflowError

警告:在sun.reflect.GeneratedMethodAccessor74.invoke处的资源java.lang.StackOverflowError中捕获到异常或错误(在Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)处的java.lang.reflect.Method.invoke (Method.java:597)在org.json.JSONObject.populateMap(JSONObject.java:988)在org.json.JSONObject。(JSONObject.java:272)在org.json.JSONObject.wrap(JSONObject.java:1587) )的org.json.JSONArray。(JSONArray.java:158)的org.json.JSONObject.wrap(JSONObject.java:1569)的org.json.JSONObject.populateMap(JSONObject.java:990)的org.json。 org.json.JSONObject.wrap(JSONObject.java:1587)上org.json.JSONArray。(JSONArray.java:158)上org.json.JSONObject.wrap(JSONObject.java)上的JSONObject。(JSONObject.java:272) :1569),位于org.json.JSONObject.populateMap(JSONObject.java:990),位于org.json.JSONObject。(JSONObject.java:272)

如果我删除了用户映射中设置的汽车,错误就会消失,并且能够将用户转换为json。 汽车映射是否存在问题,将其陷入无限循环?

问题是Car对象具有对User / Friend对象的反向引用。 我在这里解决了这个问题:

休眠对象未分离

:从休眠中拉出对象。 创建单独的java对象。 遍历对象,并使用休眠对象值填充新创建的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM