0

I have created an application for converting the Hibernate criteria list results into json, first whe i tried i got Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter

I resolved that when i googled i came across this stuff Could not serialize object cause of HibernateProxy

Now i am getting the StackOverflowError as shown below

INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: 
    select
        this_.id as id1_1_0_,
        this_.base_id as base_id2_1_0_,
        this_.name as name3_1_0_ 
    from
        testdatabase12.child this_
Hibernate: 
    select
        base0_.id as id1_0_0_,
        base0_.name as name2_0_0_ 
    from
        testdatabase12.base base0_ 
    where
        base0_.id=?
Hibernate: 
    select
        childs0_.base_id as base_id2_0_0_,
        childs0_.id as id1_1_0_,
        childs0_.id as id1_1_1_,
        childs0_.base_id as base_id2_1_1_,
        childs0_.name as name3_1_1_ 
    from
        testdatabase12.child childs0_ 
    where
        childs0_.base_id=?
Exception in thread "main" java.lang.StackOverflowError
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
    at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:387)
    at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:387)
    at java.util.LinkedHashMap.newValueIterator(LinkedHashMap.java:397)
    at java.util.HashMap$Values.iterator(HashMap.java:910)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:203)
    at com.dao.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:52)
    at com.dao.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:1)
:
:

My code is as given below

App.java

public class App {
    public static void main(String[] args) {

        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        List names = session.createCriteria(Child.class).list();
        GsonBuilder b = new GsonBuilder();

        b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);

        Gson gson = b.create();
            String jsonNames = gson.toJson(names);
            System.out.println("jsonNames = " + jsonNames);
        session.close();

    }
}

Base.java

public class Base implements java.io.Serializable {

    private Integer id;
    private String name;
    private Set childs = new HashSet(0);

    // getters and setters
}

Base.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.mappings.Base" table="base" catalog="testdatabase12">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="20" />
        </property>
        <set name="childs" table="child" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="base_id" />
            </key>
            <one-to-many class="com.mappings.Child" />
        </set>
    </class>
</hibernate-mapping>

Child.java

public class Child implements java.io.Serializable {

    private Integer id;
    private Base base;
    private String name;

   //getters and setters

}

Child.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.mappings.Child" table="child" catalog="testdatabase12">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="base" class="com.mappings.Base" fetch="select">
            <column name="base_id" />
        </many-to-one>
        <property name="name" type="string">
            <column name="name" length="20" />
        </property>
    </class>
</hibernate-mapping>
Community
  • 1
  • 1
Alex Man
  • 4,746
  • 17
  • 93
  • 178

1 Answers1

0

I think it's about List. You can use ArrayList for make JSON from List.

Try this code i am not sure but when you clear red marks it will work.

public class App {
    public static void main(String[] args) {

        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        List names = session.createCriteria(Child.class).list();
        GsonBuilder b = new GsonBuilder();

        b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);

        Gson gson = new Gson();
//seperate adding
        gson.toJson("propertyName" , List.get(0).getter...());
        gson.toJson("propertyName" , List.get(1).getter...());


        session.close();

    }
}
hurricane
  • 6,521
  • 2
  • 34
  • 44