一、實體更新
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"});
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193960.html