gpt4 book ai didi

java - 如何告诉 Hibernate 不加载对象?

转载 作者:行者123 更新时间:2023-12-01 13:29:54 25 4
gpt4 key购买 nike

你好Stackeroverflowers,

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

我有 3 个表:

硬件

电脑

软件

它们具有多对多关系。因此 N 个硬件条目可以有 M 个硬件条目。

当我调用我的 Hibernate 功能时,我会得到所有带有所选软件的 PC。在软件中,我在硬件上有一个映射来获取电脑的指定硬件。到目前为止,一切都很好。

我面临的问题是,我必须从另一端使其兼容,以允许获取具有指定硬件的所有 PC,然后从 PC 获取软件。

当我有一个从 PC 上的软件链接到硬件的映射时,就可以了。当我将映射放入硬件以获取 PC 时。我得到一个 Stackoverflow,因为每次我初始化硬件来初始化 PC 时 Hibernate 都会尝试创建,然后 PC 尝试初始化硬件,所以我得到一个永远不会结束的循环。

有人可以给我提示来解决这个问题吗?

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

我感谢每一条评论。

硬件.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>

软件.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"]->de.test.database.pojo.Hardware_$$ _javassist_109["linkHardwareToSoftware"]->org.hibernate.collection.internal.PersistentSet[0]->de.test.database.pojo.pc["object"]->de.test.database.pojo.Hardware_$$_javassist_109 [“硬件到软件链接”]在 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) 在 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)

最佳答案

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

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

关于java - 如何告诉 Hibernate 不加载对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com