一、实体更新
1、通过EntityManager更新实体
EntityManager entityManager = ...; // 获取需要更新的实体 Entity entity = entityManager.find(Entity.class, id); // 修改实体属性 entity.setName("new name"); // 提交事务 entityManager.getTransaction().commit();
2、通过Repository更新实体
@Repository public interface EntityRepository extends JpaRepository{ @Modifying @Query("update Entity set name = :name where id = :id") void updateEntityNameById(@Param("id") Long id, @Param("name") String name); } // 调用Repository更新实体 @Autowired EntityRepository entityRepository; entityRepository.updateEntityNameById(id, "new name");
二、批量更新
1、通过EntityManager批量更新
EntityManager entityManager = ...; // 创建Query实例 Query query = entityManager.createQuery("update Entity set name = :name where id in :ids"); // 设置参数 query.setParameter("name", "new name"); query.setParameter("ids", Arrays.asList(1L, 2L, 3L)); // 执行更新操作 int result = query.executeUpdate();
2、通过Repository批量更新
@Repository public interface EntityRepository extends JpaRepository{ @Modifying @Query("update Entity set name = :name where id in :ids") void updateEntityNameByIds(@Param("ids") List ids, @Param("name") String name); } // 调用Repository更新实体 @Autowired EntityRepository entityRepository; entityRepository.updateEntityNameByIds(Arrays.asList(1L, 2L, 3L), "new name");
三、更新延迟加载属性
JPA默认情况下会对实体的关联属性进行延迟加载,如果需要更新延迟加载属性,需要使用EntityManager的merge方法。在更新操作之前,需要先从数据库中获取实体对象,然后修改实体对象的属性,并在最后调用merge方法更新实体。
EntityManager entityManager = ...; // 获取需要更新的实体 Entity entity = entityManager.find(Entity.class, id); entity.getLazyProperty().setLazyValue("new value"); // 更新实体 Entity updatedEntity = entityManager.merge(entity); // 提交事务 entityManager.getTransaction().commit();
四、更新乐观锁版本号
JPA提供了乐观锁机制来防止并发修改数据造成的数据不一致问题。乐观锁需要在实体类中定义一个版本属性,当更新实体时,这个版本属性会被更新。
@Entity public class Entity { @Id private Long id; private String name; @Version private Long version; } EntityManager entityManager = ...; // 获取需要更新的实体 Entity entity = entityManager.find(Entity.class, id); entity.setName("new name"); // 提交事务 entityManager.getTransaction().commit();
五、更新部分属性
有时候需要只更新实体的一部分属性,而不是全部属性。可以通过EntityManager的unwrap方法获取到Hibernate的Session实例,然后使用Session的分离更新(partial update)功能进行更新。
EntityManager entityManager = ...; Session session = entityManager.unwrap(Session.class); // 获取需要更新的实体 Entity entity = session.get(Entity.class, id); // 修改实体属性 entity.setName("new name"); // 使用Session进行分离更新 session.update(entity, new String[]{"name"});