首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

hibernate中的saveOrUpdate()不起作用,而是执行select查询,这在程序中没有提到。(使用spring+hibernate)

在使用Spring和Hibernate的程序中,当调用saveOrUpdate()方法时,却执行了select查询而没有起到预期的作用。这个问题可能是由于以下几个原因导致的:

  1. 错误的配置:首先,需要确保Hibernate的配置文件正确地指定了数据库连接信息、实体类映射关系等。可以检查hibernate.cfg.xml或者persistence.xml文件中的配置项,确保数据库连接信息正确。
  2. 事务管理:在Spring中,使用Hibernate时需要配置事务管理器。确保在Spring配置文件中正确地配置了事务管理器,并且在相关的方法或类上添加了@Transactional注解,以确保事务的正确开启和提交。
  3. 对象状态:saveOrUpdate()方法会根据对象的状态来决定是执行插入还是更新操作。如果对象是一个新创建的对象,Hibernate会执行插入操作;如果对象已经存在于数据库中,Hibernate会执行更新操作。因此,需要确保调用saveOrUpdate()方法之前,对象的状态是正确的。可以使用session.get()session.load()方法获取对象,并对其进行修改后再调用saveOrUpdate()方法。
  4. 主键生成策略:如果实体类的主键生成策略配置不正确,可能会导致saveOrUpdate()方法无法正确判断对象的状态。确保实体类的主键生成策略正确配置,并且数据库中的主键字段与实体类的主键属性对应。

如果以上方法都没有解决问题,可以尝试以下步骤进行排查:

  1. 检查日志:查看应用程序的日志文件,查找是否有任何与Hibernate相关的错误或警告信息。日志文件中可能会提供更多有关问题的线索。
  2. 调试代码:使用调试器逐步执行代码,观察在调用saveOrUpdate()方法时发生了什么。检查相关的对象状态、方法调用顺序等,以确定问题出现的具体位置。
  3. 参考文档和社区:查阅Hibernate的官方文档、用户手册以及相关的社区论坛,寻找类似问题的解决方案或者其他开发者的经验分享。

对于Hibernate的问题,腾讯云提供了云数据库MySQL和云数据库MariaDB等产品,可以作为替代方案。这些产品提供了高可用性、可扩展性和安全性,并且与Spring和Hibernate等开发框架兼容。您可以通过以下链接了解更多关于腾讯云数据库产品的信息:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hiberante知识点梳理

他很大程度简化DAO层编码工作 hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 hibernate性能非常好,因为它是个轻量级框架。映射灵活性很出色。...延迟加载 有类延迟加载和集合延迟加载,hibernate3添加了属性,查询对象时候不是立即发出sql语句而是在真正用到对象时候才发出sql语句 lazy=false 管理是否开启懒加载 对象是用...load方法,而集合默认为懒加载 5. session session是维护数据库连接并且执行查询,更新,删除操作,Session不是线程安全 6. update和saveOrUpdate...也就是说,如果此对象在数据库不存在的话,就不能使用update()方法。 saveOrUpdate()方法操作对象既可以使持久化了,也可以使没有持久化对象。...如果是持久化了对象调用saveOrUpdate()则会 更新数据库对象;如果是未持久化对象使用此方法,则save到数据库。 7.

1.4K00

Hibernate save, saveOrUpdate, persist, merge, update 区别

程序,演示save()方法使用。...因为hibernate在更新之前会先select查询该持久化对象,发现该对象和数据库一致,就不会做update操作。...saveOrUpdate()方法可以在没有事务情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存问题 save()方法与saveOrUpdate()方法最大不同点在于,saveOrUpdate...HibernateSaveOrUpdateExample.java 以下是简单hibernate程序,演示saveOrUpdate()方法使用。...saveOrUpdate()方法可以在没有事务情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存问题 save()方法与saveOrUpdate()方法最大不同点在于,saveOrUpdate

2.3K30
  • Hibernate Session和Jpa EntityManager

    S.load() = E.getReference() 执行查询时返回代理对象,这是懒加载。spring-data-jpa对应getOne(); 如果数据库没有对应记录,抛异常。...还有更任性,如果对象在缓存的话,那么getOne就会返回实体对象,否则返回代理对象。 S.get() = E.find() 执行查询时返回实体对象,立即加载。...S.save() ≈ E.persist() EntityManager没有save方法。 区别: 调用前实体对象,如果主键使用setter设置了值,E.persist()会抛异常。...E.merge()当实体对象O1位游离对象,即主键不为空: 首先查询缓存是否有该主键对应持久化对象,如果有,将缓存对象提取为O2,然后根据O1值修改O2,并对O2执行update,返回O2....如果缓存不存在,那么就发送一条select查询数据库是否有持久化对象,如果存在,查询返回持久化对象O2,根据O1修改O2属性,并对O2执行update;否则,新建一个临时对象O2,复制O1属性

    2.1K20

    hibernate系列之二

    解析: 当一个对象被执行new关键字创建以后,该对象处于瞬时态; 当瞬时态对象执行sessionsave()或者saveOrUpdate()方法后,该对象将被放入Session一级缓存,对象进入持久态...; 当持久态对象执行close()、clear()方法,对象进入脱管态; 当直接执行sessionget() load() find() 等从数据库查询对象时,查询对象也会处于持久态; 当对数据库记录进行...hibernate一级缓存就是session缓存,session缓存就是一块内存空间,用来存放java对象; hibernatesession缓存,在查询对象时,会使用对象属性先在一级缓存查询,...,则会执行update语句,将缓存内容同步到数据库,并更新快照; 如果不一致,则不执行update语句;hibernate快照作用就是确保一级缓存数据和数据库数据保持一致; 下面使用上一次运行程序...: 执行SQL查询语句,先从数据库查询 Hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_name as cust_nam2

    45830

    持久层篇

    对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序面向对象模型与数据库关系模型互不匹配问题技术;   简单说,ORM是通过使用描述对象和数据库之间映射元数据...(在Java可以用XML或者是注解),将程序对象自动持久化到关系数据库或者将关系数据库表行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。...1、Session在调用数据库查询功能之前,首先会在一级缓存通过实体类型和主键进行查找,如果一级缓存查找命中且数据状态合法,则直接返回;    2、如果一级缓存没有命中,接下来Session会在当前NonExists...2、Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁...Mybatis首先去缓存查询结果集,如果没有查询数据库,如果有则从缓存取出返回结果集就不走数据库。

    1.3K60

    p6使用教程_pwdump7使用

    在之前hibernate总结,遇到一个小问题,那就是打印sql语句问题.在上个hibernate项目的基础上(spring+hibernate),继续p6spy学习(p6spy...prop> 但是这样有个问题,那就是hibernate打印参数都是一些?...从上例可知,使用connection进行操作时摒弃了statement,而使用PreparedStatement,statement采用硬编码,每次执行sql都会进行编译,效率低,同时还能带来sql注入等不安全因素...,比如批量插入,删除等,可以直接使用statement. hibernate默认使用PreparedStatement,其取格式sql是预编译sql(参数没有被完全注入进来),从而会有一系列?...,要显示思路一种就是改变取sql时机,等参数全部注入完成再取(p6spy),一种就是利用log,将传入参数打印出来(这样sql,与参数分离),显然后一种没有前一种方便(hibernate打印sql)

    32310

    Hibernate四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate添加,修改,查询(三种查询方式)方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略; 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.java...修改操作,核心代码《session.saveOrUpdate(user);   session.update(user);这个就不演示了,用法一样,将他们替换一下即可,只是saveOrUpdate更加强大说...》:        session.saveOrUpdate(user);       这个实现是如果没有实体类编号就执行保存操作,如果有实体类编号就执行修改操作;         设计Hibernate...;       (2):HQL查询Hibernate提供面向对象查询语句,查询是对象以及对象属性,区分大小写。...sql语句,适合使用复杂查询,或者不想使用HQL或者criteria查询,可以使用本地sql查询,缺点,不能跨越数据库,一般不适用,除非遇到复杂sql语句才使用:     核心代码:       /

    5.1K110

    hibernate框架对象状态

    increment:hibernate先会查询数据最大id值,然后在最大值加1在进行保存操作。...问题2: 删除对象时候,没有立刻发生DELETE语句,而是在提交事务时候发送....问题3: 为什么在事务环境下,通过get方法得到对象,只要修改了属性值,会发生UPDATE语句. hibernate执行流程,不能从发送sql角度去理解,应该从对象状态方向去理解。...判断规则: 1): 对象是否有OID;———可以理解对象Id,数据库主键id 2): 判断对象是否被Session所管理(在一级缓存). 2.临时/瞬时状态 没有oid,没有被session...情况4):使用new创建对象,并设置OID(数据库存在该ID):临时状态–>游离状态; 总结: new出来对象—–>临时状态—save()/saveorupdate()/persist()—->持久状态

    84820

    Hibernate总结以及在面试一些问题.

    没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate时候,你在程序不写 Transaction的话,数据库根本就没有反应。...save() 方法很显然是执行保存操作,如果是对一个新刚new出来对象进行保存,自然要使用这个方法了,数据库没有这个对象。...saveOrUpdate() 这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入。...【此方法慎用】 在HibernatesaveOrUpdate()方法在执行时候,先会去session中去找存不存在指定字段,如果存在直接update,否则save,这个时候问题就发生了。...,所以执行就是 update,但是实际上表B根本不存在masterID这个值,当你执行查询数据库时候会发现没有插入数据,像这种情况,就得先用 masterID对表B进行查询,当返回BO为NULL

    1.6K120

    Java EE实用教程笔记----(9)第九章 Hibernate对持久化对象操作

    例如,在第一个Hibernate程序(【实例7.1】)中有以下代码片段: ?...9.1.4 saveOrUpdate()方法 SessionsaveOrUpdate()方法能根据对象不同情况分别进行不同处理。...如果指定对象是临时建立(new创建)一个对象,即原来数据库没有相应记录,执行saveOrUpdate()方法就相当于执行save()方法;如果指定对象是游离对象,即本来在数据库中就存在,执行saveOrUpdate...第二部分 HQL查询 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代码加黑部分是对存储过程配置,下面看其在程序调用: ?...至此本篇介绍Hibernate对持久化对象操作文章结束,下篇我们开讲Hibernate高级特性,敬请期待!

    32220

    Hibernate框架学习之二

    ,首先会使用对象属性OID值在 Hibernate一级缓存中进行查找,如果找到匹配OID值对象,就直接将该对象从一级缓存取出使用,不会再查询数据库;如果没有找到相同OID值对象,则会去数据库查找相应数据...Hibernate一级缓存有如下特点: 当应用程序调用 Session接口 save( )、 update( )、 saveOrUpdate( )时,如果 Session缓存没有相应对象,,Hibernate...,执行第一次 session.get( )方法后, Hibernate向数据库发送了一条select语句,这说明此时 customer 1 对象是从数据库查找。...执行输出语句输出 customer 1 对象数据后,继续执行程序,当执行到输出 customer 2 对象代码处时,从上图输出结果可以看出,customer 2 对象查询结果被直接打印了,说明第二次调用... Session对象 get( )方法没有向数据库发送 select语句,而是直接从一级缓存获取 customer 2 对象 。

    81850

    关于hibernate对象三种状态分析

    顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference一段话来解释他们使用场合和区别   通常下面的场景会使用...  程序创建第二session调用第二个sessionupdate()方法持久这些改动   saveOrUpdate(po)做下面的事:   如果该po对象已经在本session持久化了,在本session...执行saveOrUpdate不做任何事   如果savaOrUpdate(新po)与另一个与本session关联po对象拥有相同持久化标识(identifier),抛出一个异常   org.hibernate.NonUniqueObjectException...update时候,执行完成后,会抛出异常   (2)但当我们使用merge时候,把处理自由态po对象A属性copy到session当中处于持久态po属性执行完成后原来是持久状态还是持久态...hibernate flush发生在以下几种情况:   1, 调用某些查询和手动flush(),session关闭、SessionFactory关闭结合   get()一个对象,把对象属性进行改变

    1.4K10

    SSH框架之旅-hibernate(2)

    1.2 hibernate 主键生成策略 assigned 自然主键类型 在程序设置主键。如果在映射表不设置 generator 属性,hibernate 默认使用该主键生成策略。...increment 代理主键类型 用于整型类型,由 hibernate 自动以递增方式生成,每次增量为一,但只有当没有其他进程相同一张表插入数据时,才可以使用,不能在集群环境下使用。...映射实体类不要使用final关键字修饰 hibernate 有延迟加载机制,这个机制会产生代理对象,产生代理对象是通过字节码增强技术来完成,其实就是产生了当前类子类对象实现而是用 final...)去一级缓存查找,如果找到就直接从一级缓存取出使用,不用再去数据库查询了,这样就提高了查询效率,如果一级缓存没有,就要去数据库查询,然后把查到数据信息放到一级缓存。...,而是直接从 hibernate 一级缓存,并且比较两个对象引用地址也是true。

    92930

    day30_Hibernate学习笔记_02

    一、Hibernate对象状态 对象状态 瞬时态|临时态:Transient     1、没有Hibernate产生关联(没有与Session有关联)。     ...2、与数据库记录没有产生关联,即对象没有ID(有关联:就是与数据库ID有对应)。 持久态:Persistent     1、与Hibernate有关联(与session有关联)。     ...当获得一次会话(session),hibernate在session创建多个集合(map),用于存放操作数据(PO对象),为程序优化服务,如果之后需要相应数据,hibernate优先从session...缓存获取,如果有就使用;如果没有查询数据库。...答:如果没有查询结果封装到对象,对象不会放入一级缓存

    99020

    HibernatesaveOrUpdate

    Hibernate地方就在于,一个PO脱离Session之后,还能保持状态,再进入一个新Session之后,就恢复状态管理能力,但此时状态管理需要使用session.update或者session.saveOrUpdate...,这就是Hibernate Reference中提到“requires a slightly different programming model ” 现在正式进入本话题: 简单来说,update...再谈谈saveOrUpdate用场: saveOrUpdate和update区别就在于在跨SessionPO状态管理Hibernate对PO采取何种策略。...操作封装在DAO里面的,让业务层程序员和Web层程序员不需要了解Hibernate,直接对DAO进行调用。...但是最致命是,如果整个软件分层很多,业务层程序员他拿到这个cat对象也可能是上层Web应用层传递过来cat,他自己也不知道这个cat究竟是VO,没有被持久化过,还是已经被持久化过,那么他根本就没有办法写程序

    75820

    Java面试题 - 03前言:三、框架篇:

    Mybatis#和$区别? 答: 使用${参数}就是单纯字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低;#{参数名}在SQL相当于一个参数占位符“?”...答:hibernate,对象有以下3种状态: 临时态:直接new出来对象,不处于session管理,数据库没有对象记录;调用save方法后就变成持久态。...答:使用缓存目的就是减少对数据库访问次数,以提高hibernate执行效率。...当Hibernate查询数据时候,数据并没有存在与内存,当程序真正对数据操作时,对象才存在与内存,就实现了延迟加载,节省了服务器内存开销,从而提高了服务器性能。...get方法会先查一级缓存,再查二级缓存,然后查数据库,如果没有找到会返回null。load方法会先查一级缓存,如果没有找到,就创建代理对象,等需要时候去查询二级缓存和数据库。

    1K10

    Hibernate面试题大全

    通过设置属性lazy进行设置是否需要懒加载 当Hibernate查询数据时候,数据并没有存在与内存,当程序真正对数据操作时,对象才存在与内存,就实现了延迟加载,他节省了服务器内存开销,从而提高了服务器性能...: 1.select语句太多;2.可能会加载应用程序不需要访问对象白白浪费许多内存空间; 立即检索:lazy=false; 延迟检索: 优点: 由应用程序决定需要加载哪些对象,可以避免可执行多余select...2使用了外连接,select语句数目少; 缺点: 1 可能会加载应用程序不需要访问对象,白白浪费许多内存空间;2复杂数据库表连接也会影响检索性能; 预先抓取: fetch=“join”; hibernate...所以它会立即执行Sql insert 使用 save() 方法保存持久化对象时,该方法返回该持久化对象标识属性值(即对应记录主键值); 使用 persist() 方法来保存持久化对象时,该方法没有任何返回值...命名查询使你可以使用你所指定一个名字拿到某个特定查询Hibernate命名查询可以使用注解来定义,也可以使用我前面提到xml影射问句来定义。

    2K50
    领券