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)
答案 0 :(得分:1)
如堆栈跟踪所示,问题与映射和使用Hibernate从数据库加载数据无关。当您使用Jackson序列化bean时会出现问题,因为您具有双向关联,因此循环引用会导致Jackson无休止地循环。
因此,您应该选择如何序列化对象,并使用Jackson注释或使用DTO来序列化它们并打破对象之间的循环。例如,您可以在@JsonIgnore
字段上添加linkHardwareToSoftware
,以便在序列化硬件实例时不会序列化软件集合。