【问题标题】:select Query Run for hibernateTemplate.save()为 hibernateTemplate.save() 选择查询运行
【发布时间】:2026-02-13 22:30:01
【问题描述】:

我正在使用带有 spring 的 hibernate 3.5.0 final。在此我想将数据保存到一个表中,该表具有与其他三个表关联的复合键。我使用了 hibernateTemplate.save()。但是当我看到日志时它清楚地表明每次插入之前都会发生选择。我仍然无法确定原因。

请帮忙!

映射:

<hibernate-mapping>
    <class name="class1" table="EVENT_ASSET_DISPOSITION">
        <composite-id name="id" class="Idclass">
            <key-property name="pk1" type="java.math.BigInteger">
                <column name="PK_1" precision="38" scale="0"  not-null="true"/>
            </key-property>
            <key-property name="pk2" type="long">
                <column name="PK_2" not-null="true" />
            </key-property>
            <key-property name="pk3" type="long">
                <column name="PK_3" precision="38" scale="0" not-null="true"/>
            </key-property>
        </composite-id>
        <property name="column1" type="java.math.BigDecimal" generated="insert">
            <column name="COLUMN_1" precision="38" scale="0" />
        </property> 
</hibernate-mapping>

SQL:-

[STDOUT] (pool-14-thread-1) 插入 TABLE_1 (COLUMN_1,PK_1,PK_2,PK_3) 值 (?, ?, ?, ?,) 2011-02-14 08:28:30,312 INFO [STDOUT] (pool-14-thread-1) Hibernate: select table1_.COLUMN_1 as COLUMN1_280_ from TABLE_1 as table1_ where table1_.PK_1=?和 table1_.PK_2=?和 table1_.PK_3=?

干杯, 德瓦拉克

【问题讨论】:

  • 你能显示你的映射和记录的 SQL 语句吗?
  • 我已添加到问题中。评论中没有足够的空间。

标签: hibernate spring orm jakarta-ee


【解决方案1】:

hibernate 用来确定对象是否是瞬态的一种机制是版本控制

如果您向映射/对象添加版本列,它应该可以解决问题

<version name="version" column="version" type="integer" unsaved-value="undefined"/> 

编辑 1:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-version

@参见第 5.1.9 节

【讨论】:

  • 这是否应该在表中有一个名为 version 的列???我得到 column not found 异常。
  • 这是正常行为吗?为什么休眠会在保存之前进行选择?我们是否必须一直添加版本控制以避免它?
  • 据我所知;是的,hibernate 没有其他方法可以区分这两个对象。
【解决方案2】:

日志显示select是在insert之后发出的。这是因为column1被声明为generated="insert",因此Hibernate需要在insert之后获取该列的生成值。

另请参阅:

【讨论】: