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

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JPA(Java Persistence API)是Java语言中一个用于ORM(对象关系映射)的框架,通过它可以有效地管理Java对象和数据库之间的映射关系。要在JPA中执行更新语句,一般需要按照以下步骤进行: 1. 创建EntityManager对象:在JPA中,所有的操作都是由EntityManager对象负责执行的,因此在执行任何操作之前,需要先创建一个EntityManager对象。 2. 创建Transaction对象:在JPA中,所有的操作都应该在事务的范围内执行,因此在执行任何操作之前,需要先创建一个Transaction对象,并且在事务的范围内执行所有的操作。 3. 更新实体对象:在JPA中,更新实体对象的方法一般包括两种,一种是通过EntityManager的merge方法更新对象,另一种是通过EntityManager的flush方法将对实体对象所做的更改同步数据库中。 4. 提交Transaction:在所有的操作都执行完毕之后,需要提交Transaction对象,将所有的更改持久化到数据库中。 总之,在JPA中执行更新语句需要注意事项较多,需要熟练掌握JPA的相关知识并进行实践才能更好地应用。 ### 回答2: JPA(Java Persistence API)是Java EE 5平台中标准定义的ORM(对象关系映射)规范,为Java开发人员提供了一个简单、统一的方法来管理关系型数据库和Java对象之间的映射关系。JPA update语句是用于修改数据库中已存在的数据的语句,其主要目的是为了满足对数据进行动态更改和更新的需求。 在JPA中,update语句可以使用JPQL(Java Persistence Query Language,JPA查询语言)来实现。JPQL是一种面向对象的查询语言,它与SQL有很多相似之处,但更为安全、易于维护和高度可移植。通过JPQL,我们可以使用实体类的属性和关系等来查询和更新数据库中的数据。 实现JPA update语句的方法如下: 1. 首先,我们需要创建一个EntityManager对象,用于操作数据库。代码如下: EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName"); EntityManager em = emf.createEntityManager(); 2. 然后,我们可以创建一个JPQL查询语句,用于更新数据。在JPQL语句中,我们需要使用UPDATE关键字来指定要更新的实体类,SET关键字来指定要更新的属性,以及WHERE关键字来指定更新的条件。代码如下: String jpql = "UPDATE EntityClassName SET attributeName = :newValue WHERE condition"; 其中,EntityClassName代表要更新的实体类名,attributeName代表要更新的属性名,newValue代表要更新成的新值,condition代表更新的条件。 3. 接下来,我们需要创建一个Query对象,用于执行JPQL语句。代码如下: Query query = em.createQuery(jpql); 4. 然后,我们需要设置参数。在JPQL语句中,我们通常使用命名参数来传递参数。代码如下: query.setParameter("newValue", newValue); 其中,newValue代表要更新成的新值。 5. 最后,我们需要执行查询并提交事务。代码如下: em.getTransaction().begin(); int updatedCount = query.executeUpdate(); em.getTransaction().commit(); 其中,updatedCount代表更新的记录数。 总之,JPA update语句是用于修改数据库中已存在的数据的语句,通过JPQL语言和EntityManager对象的操作来实现。这种方式为开发人员提供了一种简单而有效的方法来管理和更新关系型数据库中的数据。 ### 回答3: JPA是Java Persistence API的缩写,是一种Java EE 规范,用于定义Java对象与关系型数据库之间的映射。使用JPA,可以通过面向对象的方式,对数据库进行CRUD操作,其中包括Update语句。 JPA中的Update语句可以通过两种方式实现:通过EntityManager的merge()方法,或者通过Query的executeUpdate()方法。 1. 通过EntityManager的merge()方法 EntityManager的merge()方法用于将实体对象与持久化上下文进行同步,即将对象的状态与数据库中的状态进行比对和更新。通过调用merge()方法,可以将实体对象的状态同步数据库中,从而实现Update操作。 以下是通过EntityManager的merge()方法实现的Update语句的示例代码: ```java EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Employee employee = entityManager.find(Employee.class, 1L); // 获取需要更新的实体对象 employee.setName("New Name"); // 修改对象的属性 entityManager.merge(employee); // 调用merge()方法进行同步 entityManager.getTransaction().commit(); // 提交事务 ``` 2. 通过Query的executeUpdate()方法 Query是JPA中用于执行JPQL语句的接口,executeUpdate()方法用于执行Update语句。这种方式相比于EntityManager的merge()方法,更加直接,也更加灵活,可以实现一些比较复杂的Update操作。 以下是通过Query的executeUpdate()方法实现的Update语句的示例代码: ```java EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Query query = entityManager.createQuery("UPDATE Employee e SET e.name = :name WHERE e.id = :id"); // 定义Update语句 query.setParameter("name", "New Name"); // 设置参数 query.setParameter("id", 1L); int updatedRows = query.executeUpdate(); // 调用executeUpdate()方法执行Update语句 entityManager.getTransaction().commit(); // 提交事务 ``` 需要注意的是,无论是使用EntityManager的merge()方法还是使用Query的executeUpdate()方法,都需要在事务的保护下进行。因为JPA中的所有CRUD操作都需要在线事务中进行,否则可能会导致数据不一致的问题。因此,在进行Update操作时,需要先开启事务,执行完之后再提交或者回滚事务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chemyoo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值