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持久化对象值改变后自动更新的条件
在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持久化类编写规则
持久化类即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学习(1):持久化类和映射文件
【持久化类】 持久化类:指的是一个Java类和数据库表建立了映射关系。 POJO:“Plain Old Java Object”,从字面上翻译为“纯洁老式的java对象”,但大家都使用“简单java对象”来称呼它。 POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象持久化类的主要规则: 1.需要一个无参构造器。 解释:Hibernate框架会使...
Hibernate持久化类与主键生成策略
Hibernate持久化类什么是持久化类呢?在Hibernate中持久化类的英文名称是Persistent Object(简称PO),PO=POJO+hbm映射配置文件。 对于Hibernate中的PO,有如下编写规则: 必须提供一个无参数的public构造方法。 所有属性要用private修饰,对外提供public的get/set方法。 在PO类必须提供一个标识属性,让它与数据库中的主键对应,我
Hibernate使用xml配置持久化类
Hibernate通过对象关系映射,使用持久化类代替传统的sql语句对数据库进行操作(通俗说就是把数据表变成一个实体类来看待和操作)。其中,持久化类可以使用 1.配置对应的hbm.xml(关系映射配置文件)来映射持久化实体类。 2.直接在持久化实体类以注解方式配置。 前期工作: 一、导入Hibernate相关依赖包(包括本人使用的mysql驱动包和c3p0连接池依赖包): 二、创
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中PO(持久化对象)与POJO(普通的JavaBean)
PO = persisent object 持久对象
Hibernate入门(三)之持久化类编写规则
什么是持久化类?Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久的存储到关系型数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实持久化类就是一个Java类与数据库表建立了映射关系,那么这个类称为是持久化类。其实你可以简单的理解为持久化类就是一个Java类有了一个映射文件与数据库的表建立了关系。持久化类的编写规则 持久化类需要提供无参构造
Hibernate通过注解写持久化类
Hibernate有两种方法来写映射文件,当运行Hibernate程序时,会先访问hibernate.cfg.xml配置文件读取配置文件中的信息连接数据库。然后访问映射文件的路径无论是通过注解的形式还是hbm.xml的形式。如果数据库中没有持久化类所对应的表,那么会自动生成表。 通过注解写持久化类 @Entity //告诉hibernate这是一个持久化类 @Table(name="表名"
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基础学习之实体类(持久化类)的编写规则及相关操作(CRUD)
实体类与表名一一对应,类中的属性与表中的列名(column)一一对应,中类名.hbm.xml中配置;编写规则(1)实体类中的属性都是private私有的;(2)私有属性的setter和getter方法都是共有的public;(3)要求实体类必须要有一个属性作为唯一值(需要与表中的主键primary key对应);(4)实体类属性建议不使用基本数据类型,而是使用基本数据类型所对应的包装类;     ...
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开发实践笔记--对象在set属性时更新了数据库问题
之前一直没发现这个问题,后来是因为我的导航栏数据库中数据发生变动后,产生菜单的时候又update了一遍数据库中的数据,使得部分数据值为空了,当时觉得很奇怪,后来仔细看了下log4j打印的日志发现其中有更新的动作,在代码中将数据库中获取到的对象set一个对象属性时,数据库就update了,但是这个问题是怎么产生的呢? 问题重述 Set users = new HashSet(); Use
Hibernate三种持久化对象的状态
三种持久化对象的状态: Transient瞬时态: 特点:持久化对象没有唯一标识OID.没有纳入Session的管理.   Persistent持久态: 特点:持久化对象有唯一标识OID.已经纳入到Session的管理.   ***** 结论:持久化持久态对象有自动更新数据库的能力. Detached脱管态: 特点:持久化对象有唯一标识OID,没有纳入到Session管理.  
持久化对象的自动更新数据库和缓存
自动更新数据库使用的是hibernate的一级缓存
Hibernate持久化类中对象的3种状态
Hibernate中,持久化类的实例对象的状态可以分为3类: 瞬时对象(Transient Objects):处于临时状态的对象属于瞬时对象。 java对象何时会进入临时状态? (1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。 (2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,dele
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创建持久化类
一 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的方法获取对象后,对象调用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查询出的实体,set值后,自动更新到数据库
之前做的一个功能,更新订单为取消状态失败,事务回滚,那么订单回滚过后的状态已经是未取消。 但是,事物即使回滚了,但订单状态却被置成了已取消。这个问题困扰了很久。 代码是 OrderInfo orderInfo = orderInfoDao.findByCode(String orderSin);//这底层调用的是hibernate的list(); orderInfo.setOrderSta
深入理解Hibernate持久化3种状态
学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。但是大家又是否对hibernate的ses
【Hibernate学习笔记】2:编写持久化类和对应的映射文件
POJO和PO POJO是受ORM管理的JavaBean,在Hibernate框架里就是受Hibernate管理的JavaBean,这个管理是通过上篇学的配置文件,以及这篇要学的映射文件来实现的。 PO则是Presistent Object,是持久对象。POJO终究是一个普通的Java对象,还是用new 构造器的方式创建,由gc回收的;但PO则和数据库的记录做了关联,对PO的修改将受ORM框架...
hibernate持久化类的编写规则
持久化类的概述 什么是持久化类 持久化:将内存中的一个对象持久化到数据库中的过程。hibernate框架就是用来进行持久化的框架。 持久化类:一个Java对象与数据库的表建立映射关系,那么这个类在hibernate中就可以称之为持久化类。 持久化类 = Java类 + 映射文件 持久化类的编写规则 持久化类的编写规则 对持久化...
Hibernate操作持久化对象
一、什么是[对象]持久化?         Java对象的状态可分为3类,如下图,即瞬时状态,持久化和持久化状态。           简单说,在使用new关键字创建出一个对象时,就是瞬时状态;使用JDBC完成数据在持久和瞬时状态的转化;存储到数据库里面的数据,就是持久状态了。显而易见,Java对象的持久化,就是把瞬时对象,存储到数据库,变成数据库关系表中对应的一条条记录。 二、对象持久化
Hibernate自动生成持久化类和映射文件
Hibernate中根据数据库中各表,使用myEclipse的返向工程,自动生成hibernate.cfg.xml 配置文件 与person.hbm.xml映射文件和持久化类 (图文介绍)
避免 Hibernate 中用get/load方法获取的实体调用set方法后自动更新
1、问题症状描述       最近在处理一个新需求问题,代码的大致逻辑是获取一个实体对象,调用该对象的set方法设置其中的某些字段,然后把修改后的实体作为参数供其他地方调用,根据返回值来决定是否更新这个实体到数据库中。       按照这个思路调用了系统中的getByid方法,结果测试的时候发现,不管返回值是什么,这个实体最终都被更新到数据库中了。好吧,这明显是有问题的....【没有问题的代码
关于hibernate持久化所造成的问题以及解决方案
hibernate的持久化是否困扰到你
hibernate持久化对象的四个状态
持久化操作是Hibernate的核心。Hibernate的实例状态分为4种: 1、瞬时状态(Transient) 2、持久化状态(Persistent) 3、游离状态(Detached) 4、删除状态瞬时状态(Transient) 通过new开辟内存空间创建的实体对象,但是它没有纳入hibernate session的管理之中,如果没有变量对它引用,它将会被JVM(垃圾回收器)回收。瞬时状
hibernate持久态数据自动更新的执行过程
如图,1、通过session查询出的user对象为持久态对象,同时该持久态对象会放到session一级缓存和快照区(副本)中 2、当修改了user也即持久态对象中属性的值,一级缓存中的内容也会随着修改,但一级缓存对应的快照区内容不会修改, 3、最后提交事务时,比较它们的内容,如果不相同,把一级缓存内容更新到数据库,如果相同,不会更新到数据库。
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之持久化忽略字段
需求: hibernate注解持久化的时候有些字段不需要 实现: @Transient public String getBegin() { return begin; }  
Hibernate配置及持久化操作(CRUD)
hibernate.cfg.xml文件 Hibernate中最核心的配置文件 功能: 数据库方言的配置数据库连接参数的配置数据库连接池的配置加载对象关系映射文件 Hibernate映射主要是通过关系对象映射文件来实现 作用:将实体类映射到关系文件数据库表中。 Session缓存和持久化生命周期 Session缓存称为一级缓存 原理: 当应用程序调用Se
Hibernate中持久化类
Hibernate中持久化类 一、编写规则 •    提供一个无参数 public访问控制符的构造器 •    提供一个标识属性,映射数据表主键字段 •    所有属性提供public访问控制符的 set  get 方法(javaBean) •    标识属性应尽量使用基本数据类型的包装类型(int->Integer等) •    不要用final修饰实体 (将无法生成代理对象进行
持久化对象-注解方式
持久化(persistent)对象简单来说就是把领域模型对象存储到数据库中,这个过程称之为持久化。现今大行其道的ORM框架——Hibernate,JPA(Java Persisitence API)简化了使用JDBC书写SQL语句于数据库进行交互的方法。对持久化对象进行了比较合理的处理。 Hibernate可以利用注解方式配置对象 注解 Annotation模式 注解规范定义文档:JSR 1...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链问题 ios视频开发问题