getHibernateTemplate().saveOrUpdate(t)可以插入不能更新

2024-08-21 00:38

本文主要是介绍getHibernateTemplate().saveOrUpdate(t)可以插入不能更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我自己在测试毕业设计的时候,保存和更新使用的是同一个方法,老是更新不上去,不晓得怎么回事,没事就百度百度,GoogleGoogle

  • 看看
    hibernate 实体对象有三种状态
    自由状态(Transient)
    持久状态(Persistent)
    游离状态(Detached)
    关于这三种状态的区别:
    P状态 即跟session实例关联了 已经有了相对应的数据库中的主键值,所以对象处于该状态save或者updata 等都直接改变数据库中的值。
    而T状态跟D状态则不会直接改变数据库中的值,T状态是仅仅实例化一个VO对象而没有跟session实例进行任何关联则该对象处于自由状态,对于D对象则是由于与session实例相关的对象进行完持久化操作后关闭了session得到的对象状态,此时该对象有对应到数据库里的主键,可以与session实例相关把他由游离态转变为持久态。

注意:当一个对象处于持久态后被删除后,该对象虽然有数据库主键值,但是数据库中已经找不到与之相对应的记录,所以当一个持久态的对象在执行完delete方法后,就转入自由态而非游离态。游离态是该对象持有的主键可以对应到数据库里的一条记录。

我们把处于自由态和游离态的对象叫vo 而处于p状态的对象叫po
vo是相对独立的实体对象,在hibernate里处于非管理状态.
而po是有hibernate纳入到它的实体管理器的对象代表了与数据库中某条记录对应的hibernate实体po的变化在事务提交时将反应到实际的数据库中。
如果一个po与session实例分离那么此时它就变为一个vo。
为了避免在项目开发的过程在表示层出现po传值 .可以用Apache jakarta Commons Beanutils 的复制属性的方法。
举例说明:

Tuser user = new Tuser(); 
Tuser anotherUser =new Tuser(); try{ Beantils.copyProperties(anotherUser,user); System.out.println(antherUser.getName()); 
}catch(IllegalAccessExption e){ 
e.peintStackTrace(); 
} 

我的t对象就是处于Session中,持久化状态,已经在Session中存储过了,所以继续寻找,寻到了csdn论坛上关于getHibernateTemplate().flush();的解释
这跟线程有关系,应该是spring使用是ThreadLocal ,一个线程对应一个session,可能是你在同个线程下多次调用 了update,update操作的是游离状态,而出问题的情况下应该是你的session里面已经有一个持久态的userInfo,而更新持久态是要用flush
所以flush()就是刷新缓存……

这篇关于getHibernateTemplate().saveOrUpdate(t)可以插入不能更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091632

相关文章

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

电脑软件不能安装到C盘? 真相颠覆你的认知!

《电脑软件不能安装到C盘?真相颠覆你的认知!》很多人习惯把软件装到D盘、E盘,刻意绕开C盘,这种习惯从哪来?让我们用数据和案例,拆解背后的3大原因... 我身边不少朋友,在使用电脑安装软件的时候,总是习惯性的把软件安装到D盘或者E盘等位置,刻意避开C盘。如果你也有这样的习惯,或者不明白为什么要这么做,那么我

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

vscode不能打开终端问题的解决办法

《vscode不能打开终端问题的解决办法》:本文主要介绍vscode不能打开终端问题的解决办法,问题的根源是Windows的安全软件限制了PowerShell的运行,而VSCode默认使用Powe... 遇到vscode不能打开终端问题,一直以为是安全软件限制问题,也没搜到解决方案,因为影响也不大,就没有管

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE