如何告诉Hibernate不加载对象?

时间:2014-02-07 15:07:23

标签: java hibernate orm mapping many-to-many

Hello Stackeroverflowers,

我想问一下如何解决以下问题:

我有3张桌子:

硬件

PC

软件

他们有多对多的关系。所以N个硬件条目可以有M个硬件条目。

当我调用我的Hibernate时,我会用所选的软件获得所有Pc。在软件中,我有一个Mappign on Hardware来获取指定的PC硬件。 到现在为止还挺好。

我面临的问题是,我必须从另一方面使其兼容,以允许使用指定的硬件然后从Pc的软件获得所有Pc。

当我有一个映射,从Software over Pc链接到硬件时,它可以。当我将映射放入硬件以获得Pc时。我得到一个Stackoverflow因为Hibernate试图创建每次我初始化硬件初始化Pc和Pc尝试然后初始化硬件所以我得到一个永远不会结束的循环。

有人能给我一个提示来解决这个问题吗?

我听说属性逆可以解决这个问题,但我不知道它在哪里放置它以及它是如何工作的。

我很感谢每一条评论。

Hardware.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 04.11.2013 17:30:12 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="de.test.database.pojo.Hardware" table="object" schema="XXX">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="fkserialId" type="int">
            <column name="fk_serial_id" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="name_id" not-null="true" />
        </property>
        <set name="linkHardwareToSoftware" table="pc_link" inverse="true" lazy="true" fetch="select">
            <key foreign-key="none">
                <column name="fk_serial_id" not-null="true" />
            </key>
            <one-to-many class="de.test.database.pojo.PC" />
        </set>   

    </class>
</hibernate-mapping>

PC.hbm.xml

<hibernate-mapping>
    <class name="de.test.database.pojo.pc" table="pc_link" schema="xxx">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="sort" type="int">
            <column name="sort" not-null="true" />
        </property>
        <property name="owner" type="string">
            <column name="owner" not-null="true" />
        </property>
        <many-to-one name="hardware" class="de.test.database.pojo.hardware" fetch="select">
            <column name="fk_serial_id" not-null="true" />
        </many-to-one>
        <many-to-one name="software" class="de.test.database.pojo.Software" fetch="select">
            <column name="fk_sw_id" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

Software.hbm.xml

<hibernate-mapping>
    <class name="de.test.database.pojo.Software" table="object" schema="xxx">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="fkswId" type="int">
            <column name="fk_sw_id" not-null="true" />
        </property>
        <property name="name" type="java.lang.Integer">
            <column name="name" />
        </property>
        <property name="company" type="java.lang.Integer">
            <column name="company" />
        </property>
        <set name="linkSWToHardware" table="pc_link" inverse="true" lazy="true" fetch="select">
            <key foreign-key="none">
                <column name="fk_sw_id" not-null="true" />
            </key>
            <one-to-many class="de.test.database.pojo.pc" />
        </set>   

    </class>
</hibernate-mapping>

HibernateCode.java

try
{
    String obj =" AND t.fkHWtypeId =:otid";
    if(objectType==0) 
        obj="";

    Session ses = getSession();
    Query query =  ses.createQuery(
    " FROM hardware t"+
    " WHERE t.deleted = 0 AND t.Id =:pid"+obj
    );

    query.setParameter("pid", HardwareId);

    if(objectType!=0){
        System.out.println("Reading HWtypeid...");
        query.setParameter("HWtypeid", HardwareType);
    }


    List<Tree> list = query.list();

    return list;

} catch (HibernateException e)
{
    return null;
}

堆栈跟踪:

org.codehaus.jackson.map.JsonMappingException:无限递归(StackOverflowError)(通过参考链:de.test.database.pojo.Pc [“hardware”] - &gt; de.test.database.pojo.Hardware_ $ $ _javassist_109 [ “linkHardwareToSoftware”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; de.test.database.pojo.pc [ “对象”] - &GT; de.test.database.pojo。硬件_ $$ _ javassist_109 [ “linkHardwareToSoftware”] 在org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:164)     在org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)     在org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:72)     在org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)     at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86)     在org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)     在org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)     在org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)     在org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)     在org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)

1 个答案:

答案 0 :(得分:1)

如堆栈跟踪所示,问题与映射和使用Hibernate从数据库加载数据无关。当您使用Jackson序列化bean时会出现问题,因为您具有双向关联,因此循环引用会导致Jackson无休止地循环。

因此,您应该选择如何序列化对象,并使用Jackson注释或使用DTO来序列化它们并打破对象之间的循环。例如,您可以在@JsonIgnore字段上添加linkHardwareToSoftware,以便在序列化硬件实例时不会序列化软件集合。