关于Jpa使用Update方法进行更新操作,却没有同步到数据库的原因
来源:互联网 发布:f检验软件 编辑:程序博客网 时间:2024/05/17 21:49
关于Jpa使用Update方法进行更新操作,却没有同步到数据库的原因
关于JPA的Update操作解释
JPA的Update操作相当于saveOrUpdate,保存调用的是persist,更新则是merge。该方法会判断要操作实体的状态,其实主要是通过当前的实体中是否包含主键,如果含有主键则会进行merge操作,否则就是进行persist操作。
但在使用过程中会出现一种情况,当我们将一个实体从后端查询至前台页面展示,更改数据后,想到后端进行保存,却发现该实体无法保存。其实不能保存是正常的,这首先要从struts2说起了。
当我们在页面点击修改后,我们的参数是通过struts2进行封装成一个实体类的,该实体并没有jpa的entityManager 中托管,是一个游离态的实体,游离态的实体是不能保存到数据库的。
解决方法有如下几种方案:
1.先从数据查询到该实体,在将数据设置到从数据库查询的实体中,然后再保存,这是比较笨的方法。
2.通过使用entityManager 中flush方法将已经使用merger方法进行托管的实体,更新到数据库。
这里稍微解释下eneityManager。
entityManager 有 merge/refresh/flush 方法。
理解eneityManager的这三个方法的作用和区别,首先需要分清楚PersistenceContext 和 EntityManager.
PersistenceContext:是entity的一个实例。
EntityManager:是和PersistenceContext联系在一起的,被用来创建、删除或者查找一个持久化Entity实例。
换句话来说PersistenceContext可以说成是数据库的缓存。
1.merge
通过entityManager将一个存在的实体“同步到”persistenceContext中。
实体的状态将从其单独的状态转换为受persistenceContext管理的状态。
如果Entity是新创建的,则这个方法类似于persist()这个方法。
如果Entity已经存在的,则只作为更新操作。
2.Flush
将PersistenceContext的信息同步到数据库中。
当触发Flush这个动作的时候,所有的实体都将会被insert/update/remove到数据库中。
数据库不会触发Commit的操作。
3.Refresh
Refresh的作用是从数据库中将Entity的状态进行更新操作。如果Entity和数据库中的数据不一致,将更新数据库中的数据到Entity中。
3.通过使用entityManager获得EntityManagerFactory重新创建一个新的entityManager,手动使用事物处理进行更新到数据库 。
EntityManager em = this.getEntityManager().getEntityManagerFactory().createEntityManager();em.getTransaction().begin();DpcTypeTimeSet dts = this.update(T);//this.merge(T);//this.getEntityManager().flush();//此处注释掉事物处理代码可用,即第二种方法em.getTransaction().commit();
4.在书写Action类时实现ModelDriven接口。
- 关于Jpa使用Update方法进行更新操作,却没有同步到数据库的原因
- spring使用jpa进行update操作
- 关于SpringBoot使用JPA的更新操作(save方法和原生SQL方法)
- hibernate---关于session已经update了,数据库却没更新
- Hibernate 中save方法运行成功之后却没有保存进数据库的原因
- g++: command not found的解决 G++没有装或却没有更新 以下方法都可以试试: centos: yum -y update gcc yum -y install gcc+
- 数据库一个表更新时没有加where 语句,把数据库恢复到执行update前的过程如下
- hibernate save成功却没有保存到数据库的错误
- SpringBoot中连接MYSQL数据库,并使用JPA进行数据库的相关操作
- SpringBoot中连接MYSQL数据库,并使用JPA进行数据库的相关操作
- 关于Enum枚举类没有values()方法却可以在枚举类中使用的问题
- 解剖angularjs在代码中改变了 model 的值,view 却没有更新原因
- 关于AcceptChange方法和Update更新数据库问题
- 关于JPA同过javabean反射到数据库不能生产对应表且不报错的原因分析
- 使用 Spring JPA 进行大量数据库操作时,连接数过多的问题
- 1、出错原因:没有更新到最新的cocoapods版本
- 关于mybatis进行Update时,无法更新的问题
- 更新数据库内容,update方法
- 输出从当天开始算的到之前三周的周区间
- 大数据系统基础导论
- 基础数学
- Unity3d IEnumerator 协程的理解
- Fiddler 4 前期配置指南——实现手机代理
- 关于Jpa使用Update方法进行更新操作,却没有同步到数据库的原因
- 诚邀 | 上百件智能硬件随性玩,北京硬蛋空间10月11日闪耀登场!
- 狗狗不捣蛋—逗爱宠物智能乖乖圈尝鲜测评
- Linux正则表达式 sed
- java 数据类型 类的基础
- 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
- 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法
- 如何自定义NavigationBar的高度
- 2017.10.28日报