zoukankan      html  css  js  c++  java
  • hibernate查询出的实体,set值后,自动更新到数据

    如图:

    故事背景:(p.s.我们的项目没有正确配置事务xml文件,未明原因导致事务定义的规则不起作用)获取一个资讯对象,调用该对象的set方法设置其中的content字段,然后把修改后的实体丢到官网首页进行展示。结果部署到生产后发现,在进入首页获取资讯列表时,在调用到如图的方法时,会直接将临时set的content持久化到到数据库中了。好吧,这明显是有问题的....那么,是什么原因呢?

    答:

    a.查看日志信息后发现,系统总是会打印出一个update语句。说明系统的确是执行了更新操作的,但是我并没有调用任何和update相关的方法。
    b.跟踪代码发现,queryByCondition方法其实是调用了hibernate的get方法。嗯,果然,问题出在这里了.....
    c.Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,那么在事务递交的时候,Hibernate会把你设置的值自动更新到数据库中。

    如何解决:

    方案1:在获取实体对象后,调用下getHibernateTemplate().evict(entity)方法,该方法的作用是把持久化对象变成托管状态。变成托管状态后,Hibernate就不会再去自动更新该实体。

    方案2:正确配置事务。参考:https://blog.csdn.net/qq_19167629/article/details/80426625

    参考:https://www.cnblogs.com/xiao-lei/p/10005625.html

  • 相关阅读:
    activiti07- Task
    Activiti-06-.事件
    Activiti-05-.Deployment and MN 2.0 Introduction
    Spring-Hibernate-web的延迟加载方案
    Spring-Struts2-基本集成
    Spring-hibernate-BaseDao
    Spring-hibernate
    Spring-java-模板设计模式
    搭建apache,指定MPM模式为worker(不许用yum安装)
    apache + tomcat负载均衡搭建
  • 原文地址:https://www.cnblogs.com/hedongfei/p/10730700.html
Copyright © 2011-2022 走看看