gpt4 book ai didi

java - 如何在大型项目中修复 "object references an unsaved transient instance - save the transient instance before flushing"?

转载 作者:行者123 更新时间:2023-12-01 09:56:50 43 4
gpt4 key购买 nike

我在 Ubuntu 14.04 和 Tomcat 6 上下载并安装了 Perseus 项目 ( Open Source Code ) 的源代码。该项目已经多年没有修改了,所以它一定是 hibernate 中的一些新功能正在执行这个。

我在很多线程上看到了这里的解决方案,但它们解决了编写代码时调试代码的问题,而不是迁移“一次”肯定有效的项目。我正在使用的代码自 2008 年至 2011 年以来未曾修改过。 (我已经确定他们现在正在“Mandriva Linux 2010.2”上运行它)因此,我需要能够大规模地解决这个问题 - 要么是搜索/替换方法,要么是配置文件更改。我自己从未使用过 hibernate,所以我不明白发布的答案的完整含义。

谢谢。

此外,这些文件不使用 @ 注释语法,但映射似乎是通过 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">
<hibernate-mapping package="perseus.document.dao">
<class name="HibernateChunkDAO$ChunkRow" table="hib_chunks" batch-size="10">

<id name="id" type="int" column="id" unsaved-value="null">
<generator class="native" />
</id>

<property name="documentID" column="document_id" type="string"
length="50" index="doc_idx doc_type_idx doc_type_value_idx
doc_cid_idx doc_so_eo_idx doc_so_eo_type_idx doc_dq_idx
doc_so_eo_type_val_idx" />

<property name="elementName" column="element" type="string"
length="20" />
<property name="type" column="type" type="string" length="30"
index="doc_type_idx doc_type_value_idx doc_so_eo_type_idx
doc_so_eo_type_val_idx" />
<property name="value" column="value" type="string" length="250"
index="doc_type_value_idx doc_so_eo_type_val_idx" />

<property name="position" column="position" type="int" />
<property name="absolutePosition" column="abs_position" type="int" />

<property name="chunkID" column="chunk_id" type="string"
length="255" index="doc_cid_idx" />

<property name="openTags" column="open_tags" type="text" />
<property name="closeTags" column="close_tags" type="text" />

<property name="startOffset" column="start_offset" type="int"
index="doc_so_eo_idx doc_so_eo_type_idx doc_so_eo_type_val_idx" />
<property name="endOffset" column="end_offset" type="int"
index="doc_so_eo_idx doc_so_eo_type_idx doc_so_eo_type_val_idx" />

<property name="displayQuery" column="display_query" type="string"
length="100" index="doc_dq_idx" />
<property name="head" column="head" type="text" />
<property name="headLanguage" column="head_lang" type="string"
length="10" />
<property name="hasCustomHead" column="custom_head" type="boolean" />

<set name="frequencies" inverse="true" cascade="all-delete-orphan"
lazy="true" batch-size="30">
<key column="chunk_id" on-delete="cascade" />
<one-to-many class="perseus.ie.freq.Frequency" />
</set>

<many-to-one name="lemma" column="lemma_id" cascade="all" lazy="false" />

<!--
<list name="senses" inverse="false" cascade="all-delete-orphan"
lazy="false" batch-size="30">
<key column="chunk_id" />
<list-index column="position" />
<one-to-many class="perseus.voting.Sense" />
</list>
-->
</class>
</hibernate-mapping>

最佳答案

发生这种情况的原因如下:

您在实体中定义了一个尚未持久化在数据库中的关联,在持久化此关联之前,您尝试刷新 session 。例如,您有一个包含 transient 实例集合的集合关联,因此在刷新之前你必须先持久化这个集合。

要解决此问题,您有 2 个选择:

  1. 通过调用 Session.save() 方法手动将集合保留在代码中。

  2. 如果您想在 Hibernate XML 文件中使用标签或希望使用注释,请在集合关联上使用cascade="all"(对于 xml)或cascade=CascadeType.ALL(对于注释)。

关于java - 如何在大型项目中修复 "object references an unsaved transient instance - save the transient instance before flushing"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37152377/

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