hibernate自动更新持久化类的问题?

有碰到过改变了一个持久化类的值但是没有主动更新到数据库结果hibernate自动把值更新到数据库了。看了网上的一些帖子和解答感觉语焉不详,说什么持久化类只要做了改变hibernate就会自动更新到数据库,照这个说法我们都不用手动去做update操作了?另外没有显式的update操作我怎么知道hibernate什么时候去更新呢?求高人解答,最好能有hibernate的官方说明或文档。

0

2个回答

hibernate对你的持久化bean做了动态代理,也就是你hibernate映射文件,对应的bean对根据cglib生成的新字节码文件,
在你做set操作改变其值的时候,它会试图去更新数据库数据

0
w172087242
little_how 如果有帮助,希望能结帖
接近 3 年之前 回复
w172087242
little_how 回复malie1981: 那是因为有些设置的是只读事务,那样就不会更新数据库,还有的手动清除了session缓存的结果集,清除方法evict
接近 3 年之前 回复
malie1981
malie1981 不好意思,忘了感谢你的回答了
接近 3 年之前 回复
malie1981
malie1981 但是这种自动更新的情况似乎并不是每次都发生。不然的话所有取出来的持久化类不是都要先分离掉才能做赋值操作了。但是一般项目代码并没有太过关注这个事情。我觉得hibernate这么做不是太好
接近 3 年之前 回复

是的,
隐式的修改:注解的实体和对象,修改了自动同步数据库(添加了对事物的支持)
显式的修改:就是比较传统的hql、sql这样的更新语句

建议使用显式的修改,比较明确

0
malie1981
malie1981 回复伈照不宣: 我看到hibernate持久化类不需要显式update只要调用flush就会自动提交,而自动flush的情况是1,调用某些查询的时候2,transaction commit的时候3,手动调用flush的时候,因为我在set某些值后又调用了实体中的get方法获得某些属性进行判断,在这个判断的过程中抛出异常,会不会是在调用get方法的时候会触发flush导致更新到数据库?
接近 3 年之前 回复
zy_281870667
Bug开发攻城狮 回复malie1981: 我们控制事务一般是使用spring的aop的,它是针对我们代码对session的操作而执行事务的,hibernate的隐式修改,是根据代理对象的字节码更新数据库的,不属于我们的代码操作,所以不属于aop管理,代码异常了,也就不能回滚了
接近 3 年之前 回复
malie1981
malie1981 回复伈照不宣: 这样好像有点麻烦。另外一个疑问是这个隐式修改难道不受事务控制吗?程序在设置了值之后后面的代码中抛出了runtimeexception错误,但是这个隐式更新还是执行了。如果是按照显式更新的事务理解发生runtimeexception整个事务应该是会回滚的
接近 3 年之前 回复
zy_281870667
Bug开发攻城狮 回复malie1981: 在service关闭事务,在执行特定的方法再开启事务,显式的修改
接近 3 年之前 回复
malie1981
malie1981 谢谢回复,请问有没有办法在hibernate的配置或者参数设置里不让他隐式修改,很多程序员并没有注意到这个问题,这样会很危险
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Hibernate学习-11:持久化对象状态及状态转换、持久态对象自动更新数据库
持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. 瞬时态 transient  :(临时态)特点:持久化对象没有唯一标识OID.没有纳入Session的管理 持久态 persistent :特点:持久化对象有唯一标识OID.已经纳入到Session的管理 脱管态 detached   :(离线态)特点:持久化对象有唯一标
hibernate持久化对象值改变后自动更新的条件
在hibernate中,持久化对象分为三种状态: 1)瞬时态 transient  (临时对象) :无持久化标识OID,未与Session关联 , 2)持久态 persistent  :存在持久化标识OID,与Session关联 3)脱管态 detached (离线对象):存在持久化标识OID,未与Session关联 (session.close) 对象的状态可以相互之间进行转换 直
Hibernate数据持久化及update更新问题
关于Hibernate的Session update问题 Hibernate在进行数据处理时实现了数据的持久化。持久化对象分为三种状态;分为:瞬时态、持久态、托管态;处理持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为为VO(Value Object)   瞬时态 当由new 命令开辟内存空间存储的JAVA 对象称之为瞬时对象。因为这种对象还没有进入
Hibernate使用注解配置持久化类
接上篇文章,给出Hibernate注解配置持久化类的步骤: 一、同样配置Hibernate.cfg.xml: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibe
Hibernate中的持久化类
Hibernate中的持久化类一、什么是持久化类:持久化是将程序数据在持久状态和瞬时状态间转换的机制。 持久化类(persistent class):是指它的实例可以被hibernate持久化地保存到数据库中,并且能从数据库读取的类。持久化类 = 实体类 + 映射文件。二、持久化类的编写规范 提供一个无参数 public访问控制符的构造器:因为会用到反射。 提供一个标识属性,映射数据表主键字段
Hibernate数据持久化详解
第一步:生成核心配置文件hibernate.cfg.xml加载数据库的配置信息 &amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt; &amp;lt;!DOCTYPE hibernate-configuration PUBLIC &quot;-//Hibernate/Hibernate Configuration DTD 3.0//EN&quot; ...
Hibernate持久化类编写规则
持久化类即Persistent Object,简称PO。      PO的编写规则:           1.提供无参的构造器          2. 为每一个实体字段提供对应的getter/setter方法           3.每一个实体类都需要提供一个标识属性,让它与数据库中的主键对应,我们管这个属性叫OID。           4.实体类字段均使用包装类型         
Hibernate持久化类详解
2 Hibernate持久化类详解 上接Hibernate入门学习:https://blog.csdn.net/biggerchong/article/details/84229658  目录 2 Hibernate持久化类详解 2.1持久化类的编写规则 2.2主键生成策略 2.2.1主键的分类 2.2.2 hibernate中主键生成策略 2.2.3 持久类对象3种状态 2...
Hibernate使用xml配置持久化类
Hibernate通过对象关系映射,使用持久化类代替传统的sql语句对数据库进行操作(通俗说就是把数据表变成一个实体类来看待和操作)。其中,持久化类可以使用 1.配置对应的hbm.xml(关系映射配置文件)来映射持久化实体类。 2.直接在持久化实体类以注解方式配置。 前期工作: 一、导入Hibernate相关依赖包(包括本人使用的mysql驱动包和c3p0连接池依赖包): 二、创
Hibernate持久化类的原则
持久化java类必须遵循的原则: 1.通常这个类需要一个id.建议一般使用封装类型 2.这个类不能是final修饰的 3.需要给这个类提供一个无参数的构造器 4.需要给所有属性提供getter/setter方法 5.如果涉及集合数据的操作,集合类型要使用接口类型,List,Map
Hibernate通过注解写持久化类
Hibernate有两种方法来写映射文件,当运行Hibernate程序时,会先访问hibernate.cfg.xml配置文件读取配置文件中的信息连接数据库。然后访问映射文件的路径无论是通过注解的形式还是hbm.xml的形式。如果数据库中没有持久化类所对应的表,那么会自动生成表。 通过注解写持久化类 @Entity //告诉hibernate这是一个持久化类 @Table(name="表名"
Hibernate持久化类与主键生成策略
Hibernate持久化类什么是持久化类呢?在Hibernate中持久化类的英文名称是Persistent Object(简称PO),PO=POJO+hbm映射配置文件。 对于Hibernate中的PO,有如下编写规则: 必须提供一个无参数的public构造方法。 所有属性要用private修饰,对外提供public的get/set方法。 在PO类必须提供一个标识属性,让它与数据库中的主键对应,我
Hibernate注解(一)之持久化实体
@Entity@Table(name = &quot;category&quot;, catalog = &quot;users&quot;)@Column(name = &quot;descripton&quot;, length = 500)@ManyToOne(fetch = FetchType.LAZY)@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = ...
Hibernate入门(三)之持久化类编写规则
什么是持久化类?Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久的存储到关系型数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实持久化类就是一个Java类与数据库表建立了映射关系,那么这个类称为是持久化类。其实你可以简单的理解为持久化类就是一个Java类有了一个映射文件与数据库的表建立了关系。持久化类的编写规则 持久化类需要提供无参构造
Hibernate基础学习之实体类(持久化类)的编写规则及相关操作(CRUD)
实体类与表名一一对应,类中的属性与表中的列名(column)一一对应,中类名.hbm.xml中配置;编写规则(1)实体类中的属性都是private私有的;(2)私有属性的setter和getter方法都是共有的public;(3)要求实体类必须要有一个属性作为唯一值(需要与表中的主键primary key对应);(4)实体类属性建议不使用基本数据类型,而是使用基本数据类型所对应的包装类;     ...
Hibernate持久化类中对象的3种状态
Hibernate中,持久化类的实例对象的状态可以分为3类: 瞬时对象(Transient Objects):处于临时状态的对象属于瞬时对象。 java对象何时会进入临时状态? (1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。 (2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,dele
hibernate中PO(持久化对象)与POJO(普通的JavaBean)
PO = persisent object 持久对象
hibernate 持久化类配置文件User.hbm.xml文件头
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
Hibernate框架基础
ORM基础 持久化概念 持久化方案 JDBC面临的问题 ORM简介 ORM产品 Hibernate基础 Hibernate持久化类和关系数据库的映射 Hibernate序列机制 Hibernate核心接口 Hibernate实例
Hibernate学习(1):持久化类和映射文件
【持久化类】 持久化类:指的是一个Java类和数据库表建立了映射关系。 POJO:“Plain Old Java Object”,从字面上翻译为“纯洁老式的java对象”,但大家都使用“简单java对象”来称呼它。 POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象持久化类的主要规则: 1.需要一个无参构造器。 解释:Hibernate框架会使...
Hibernate的方法获取对象后,对象调用set后会自动更新数据库内容的解决办法
例如:Object obj = dao.get(Object_2.classs,id);obj.setName(&quot;张三&quot;);这种情况下Hibernate下次提交事务的时候会把这个数据库中对应数据更新成set后的。产生原因涉及到Hibernate设计原理,(以下这段话复制地址:http://blog.csdn.net/yang_lover/article/details/45057181)1.瞬态:...
Hibernate创建持久化类
一 JavaBean的四点原则 1.必须是公有的类 2.提供公有的不带参数的默认的构造方法 3.属性私有 4.属性setter/getter封装     二 创建一个学生持久化类 import java.util.Date; //学生类 public class Students { /* * JavaBeans的四点原则
二:hibernate的持久化类和对象标识符
二 hibernate的持久化类和对象标识符 1.1持久化类的编写规范 1.1.1什么是持久化类: Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久存储到关系型数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个Java类与数据库表建立了映射关系,那么这个类称为是持久化类。其实你可以简单的理解为持久化类就是一
Hibernate并没有调用update却自动更新,解决方案
参考链接: http://www.cnblogs.com/yangy608/p/4073941.html http://bbs.csdn.net/topics/390972701?page=1 http://www.iteye.com/problems/7384 ========================================问题分析,及
Hibernate三种持久化对象的状态
三种持久化对象的状态: Transient瞬时态: 特点:持久化对象没有唯一标识OID.没有纳入Session的管理.   Persistent持久态: 特点:持久化对象有唯一标识OID.已经纳入到Session的管理.   ***** 结论:持久化持久态对象有自动更新数据库的能力. Detached脱管态: 特点:持久化对象有唯一标识OID,没有纳入到Session管理.  
持久化对象的自动更新数据库和缓存
自动更新数据库使用的是hibernate的一级缓存
Hibernate自动生成持久化类和映射文件
Hibernate中根据数据库中各表,使用myEclipse的返向工程,自动生成hibernate.cfg.xml 配置文件 与person.hbm.xml映射文件和持久化类 (图文介绍)
Hibernate -- 持久化类的编写原则
什么是持久化类: Hibernate 是持久层的 ORM 映射框架,专注于数据的持久化工作。所谓持久化,就是将内存中的数据永久存储到关系数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个 Java 类与数据库表建立了映射关系,那么这个类称为持久化类。其实你可以简单的理解为持久话类就是一个 Java 类有了一个映射文件与数据库的表建立了关系。 持久化类的编写规...
深入理解Hibernate持久化3种状态
学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。但是大家又是否对hibernate的ses
Hibernate操作持久化对象
一、什么是[对象]持久化?         Java对象的状态可分为3类,如下图,即瞬时状态,持久化和持久化状态。           简单说,在使用new关键字创建出一个对象时,就是瞬时状态;使用JDBC完成数据在持久和瞬时状态的转化;存储到数据库里面的数据,就是持久状态了。显而易见,Java对象的持久化,就是把瞬时对象,存储到数据库,变成数据库关系表中对应的一条条记录。 二、对象持久化
hibernate持久化对象的四个状态
持久化操作是Hibernate的核心。Hibernate的实例状态分为4种: 1、瞬时状态(Transient) 2、持久化状态(Persistent) 3、游离状态(Detached) 4、删除状态瞬时状态(Transient) 通过new开辟内存空间创建的实体对象,但是它没有纳入hibernate session的管理之中,如果没有变量对它引用,它将会被JVM(垃圾回收器)回收。瞬时状
避免 Hibernate 中用get/load方法获取的实体调用set方法后自动更新
1、问题症状描述       最近在处理一个新需求问题,代码的大致逻辑是获取一个实体对象,调用该对象的set方法设置其中的某些字段,然后把修改后的实体作为参数供其他地方调用,根据返回值来决定是否更新这个实体到数据库中。       按照这个思路调用了系统中的getByid方法,结果测试的时候发现,不管返回值是什么,这个实体最终都被更新到数据库中了。好吧,这明显是有问题的....【没有问题的代码
关于hibernate持久化所造成的问题以及解决方案
hibernate的持久化是否困扰到你
如何理解Hibernate的持久化?
学习Hibernate,必须要理解什么是持久化?结合了一下网上的各位大佬的观点和自己的理解: 持久化概念 持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。 而Hibernate是对JDBC的轻量级封装,其持久化就是一个把数据存储到数据库的过程,也就是说,可以将Hiberna...
hibernate持久化类的编写规则
持久化类的概述 什么是持久化类 持久化:将内存中的一个对象持久化到数据库中的过程。hibernate框架就是用来进行持久化的框架。 持久化类:一个Java对象与数据库的表建立映射关系,那么这个类在hibernate中就可以称之为持久化类。 持久化类 = Java类 + 映射文件 持久化类的编写规则 持久化类的编写规则 对持久化...
精通Hibernate——映射一对多双向自身关联关系
首先我们来看下图: 每种商品类别代表一个Category对象,每一个Category可以和父列表关联,同时也可以和子类别关联,为了表达这种一对多的双向自身关联关系可以在Category类中定义两个属性: parentCategory:引用父类别对象 childCategories:引用一组子类别对象 下面看看Category的源代码:public class Category imp
hibernate中如何用Annotion注解设置model中的字段不持久化
public final static int DELETESTATUS_YES=1; public final static int DELETESTATUS_NO=0; @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) private Integer id;
hibernate持久态数据自动更新的执行过程
如图,1、通过session查询出的user对象为持久态对象,同时该持久态对象会放到session一级缓存和快照区(副本)中 2、当修改了user也即持久态对象中属性的值,一级缓存中的内容也会随着修改,但一级缓存对应的快照区内容不会修改, 3、最后提交事务时,比较它们的内容,如果不相同,把一级缓存内容更新到数据库,如果相同,不会更新到数据库。
Hibernate配置及持久化操作(CRUD)
hibernate.cfg.xml文件 Hibernate中最核心的配置文件 功能: 数据库方言的配置数据库连接参数的配置数据库连接池的配置加载对象关系映射文件 Hibernate映射主要是通过关系对象映射文件来实现 作用:将实体类映射到关系文件数据库表中。 Session缓存和持久化生命周期 Session缓存称为一级缓存 原理: 当应用程序调用Se
Hibernate中持久化类
Hibernate中持久化类 一、编写规则 •    提供一个无参数 public访问控制符的构造器 •    提供一个标识属性,映射数据表主键字段 •    所有属性提供public访问控制符的 set  get 方法(javaBean) •    标识属性应尽量使用基本数据类型的包装类型(int->Integer等) •    不要用final修饰实体 (将无法生成代理对象进行
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链问题 大数据专业教育的问题