关于Jpa使用Update方法进行更新操作,却没有同步到数据库的原因

本文探讨了使用JPA Update方法时遇到的问题,特别是在Struts2框架下,如何正确地更新数据库记录。文章提供了多种解决方案,包括使用EntityManager的merge、flush方法,以及手动处理事务等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chemyoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值