`
zhouchaofei2010
  • 浏览: 1104158 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate删除时报identifier of an instance of xx was altered from xx to xx

 
阅读更多

 org.hibernate.HibernateException: identifier of an instance of com.gwideal.apps.xjzeg.entity.rota.NightshiftTemporary was altered from 47392c5531464d5d97a4955c8e85a92b to fe21e9b9d5754adfaa5ada7982428cc7,47392c5531464d5d97a4955c8e85a92b

 

新泾镇公务员平台街镇版接入系统

 

大致过程:

1、页面参数是id=fe21e9b9d5754adfaa5ada7982427,47392c5531464d5d55c8e85a92b

2、action 是 implements ModelDriven<T>, Preparable的

prepare方法中对实体entity 进行了hibernate的查询操作,使之和hibernate的session关联起来

@Override

protected void prepareModel() throws Exception {

....

entity =nightShiftTemporaryManager.getNightShift(temId);

....

}

 

 3、在action中调用的方法中执行了删除操作

nightShiftTemporaryManager.deleteNightShift(removeId);其中removeId是对id的截取

然后报错,debug定位到 SimpleHibernateDao<T, PK extends Serializable>中的session.delete(entity);方法

 

4、action配置的是paramsPrepareParamsStack拦截栈,该栈中拦截器顺序如下

 

<interceptor-stack name="paramsPrepareParamsStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>

 其中关键拦截器:

 

params : Sets the request parameters onto the Action

prepare :If the Action implements Preparable, calls its prepare method

modelDriven:If the Action implements ModelDriven, pushes the getModel Result onto the Value Stack

actionMappingParams:这是params 参数拦截器的子类

 

解释大概原因:

该action是实现ModelDriven的,则在modelDrivenInterceptor 拦截器中,  把entity 放入了valueStatck 中的栈顶,在接下来的actionMappingParams拦截器又把id参数赋值给了valueStatck 中root对象的id属性,这里即entity 中的id属性。所以在执行action中方法的时候,entity 的id值被赋予了参数id的值fe21e9b9d5754adfaa5ada7982428cc7,47392c5531464d5d97a4955c8e85a92b,所以在调用session.delete(entity)中。hibernate检测到了持久对象entity 的id被改变,抛出了异常;

 

由关键拦截器顺序5个步骤解释具体原因:

 

 

step1、params : Sets the request parameters onto the Action

 在该拦截器中,stuts2对action中的id属性赋值fe21e9b9d5754adfaa5ada7982428cc7,47392c5531464d5d97a4955c8e85a92b

 

step2、prepare :If the Action implements Preparable, calls its prepare method

在该拦截器中,拦截器调用了action中prepare 方法,而该方法把实体entity 和hibenate的session产生了关联,使起变成了hibernate中的持久化对象

 

step3、modelDriven:If the Action implements ModelDriven, pushes the getModel Result onto the Value Stack

在该拦截器中,把action中的实体entity 放入Value Stack中,使其在接下来的参数拦截中接受参数

 

step4、actionMappingParams:这是params 参数拦截器的子类

把请求参数id,赋给entity 的id

 

step5、所以在接下来的执行action方法中,调用session.delete(entity)中。hibernate检测到了持久对象entity 的id被改变,抛出了异常

 

 

 

 

 

分享到:
评论

相关推荐

    《S32K3xx Reference Manual》和《S32K3xx Data Sheet》

    《S32K3xx Reference Manual》 NXP Semiconductors Document identifier: S32K3XXRM Reference Manual Rev. 3, 10/2021 《S32K3xx Data Sheet》 Rev. 3 — 10/2021 Data Sheet: Technical Data

    Hibernate Reference Documentation3.1

    Table of Contents Preface 1. Introduction to Hibernate 1.1. Preface 1.2. Part 1 - The first Hibernate Application 1.2.1. The first class 1.2.2. The mapping file 1.2.3. Hibernate configuration 1.2.4. ...

    Hibernate Tutorial 03 (Object Identifier).pdf

    在本教程中,我们将深入探讨Hibernate框架中的一个核心概念——对象标识符(Object Identifier)。通过本篇教程的学习,您将了解到对象标识符在Hibernate中的重要性以及如何正确地为持久化对象设置标识符。此外,我们...

    Hibernate映射导致的几个异常

    TransientObjectException: object references an unsaved transient instance 这个异常通常发生在级联操作中,例如当配置了`cascade="save-update,persist"`。如果在保存一个对象时,该对象引用了一个未保存的...

    Hibernate+中文文档

    6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合...

    hibernate.properties

    hibernate.properties # # Hibernate, Relational ...## rollback generated identifier values of deleted entities to default values #hibernate.use_identifier_rollback true ## enable bytecode reflection...

    hibernate 重点知识原创

    【hibernate 重点知识】 一、hibernate 简介 Hibernate 是一个流行的 Java 应用程序框架,主要用于简化对象关系映射(ORM)的过程。它允许开发者使用面向对象的方式来操作数据库,通过自动映射数据库表为 Java ...

    hibernate常见异常

    、org.hibernate.id.IdentifierGenerationException 以及 a different object with the same identifier value was already associated with the session 等。 1. net.sf.hibernate.MappingException ...

    hibernate3.3.2

    9. **一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关联**:Hibernate 支持这三种关联关系的映射,通过注解或XML配置,可以在实体类之间建立关联,实现数据的级联操作。 10. **缓存机制**...

    hibernate配置参数大全

    12. **`hibernate.use_identifier_rollback`**:决定在删除操作中是否使用标识符回滚。 - 示例: ```properties hibernate.use_identifier_rollback=true ``` 13. **`hibernate.use_sql_comments`**:决定...

    Hibernate 参数配置详解

    ### Hibernate 参数配置详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它通过提供一套丰富的 API 和配置选项来简化数据库访问。本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernat-session方法

    10. **identifier of an instance of... was altered from... to...** - 这个错误提示表明尝试更改已持久化对象的标识符(ID),这是不被允许的。在`ChangID()`方法中,尝试更改新创建对象的ID,会导致Hibernate发出...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    - FIX: In "Windows ClearType" font rendering mode (OS Windows mode) the "garbage" pixels can appear from the right and from the bottom sides of the painted rectangle of the TFlexText object....

    VclZip pro v3.10.1

    If you currently work with VCLZip 2.X with TBlobStreams or some other type of streams, you can either define your own TkpBlobStream for instance which inherits from TkpHugeStream, or use the ...

    Hibernate中文详细学习文档

    6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合...

    hibernate错误解决方案

    ### Hibernate 错误解决方案 #### 一、概述 在使用Hibernate框架进行开发的过程中,经常会遇到各种各样的异常问题。这些问题可能会导致程序无法正常运行,甚至影响到系统的稳定性。本文将针对几个常见的Hibernate...

    Hibernate 参数设置一览表.doc

    11. **hibernate.use_identifier_rollback**:如果设置为`true`,在删除对象后,Hibernate会将标识属性重置为默认值,这有助于管理对象的状态。 12. **hibernate.use_sql_comments**:启用后,Hibernate会在SQL语句...

    Hibernate 转译中文版

    9. **事件监听器**:Hibernate允许自定义事件监听器,实现对对象生命周期各个阶段的监听,如保存、更新、加载、删除等,可以进行一些额外的操作。 10. **类型转换**:Hibernate支持自定义类型转换,允许开发者将...

Global site tag (gtag.js) - Google Analytics