首页 > 解决方案 > 即使实体中没有任何变化,也更新对 DB 的请求

问题描述

我使用弹簧数据和休眠。我有一个实体(TestEntity)。我制作了一个自定义休眠类型,将一个字符串字段反序列化为两列。如果我持久化一个实体然后更改它,一切正常并且休眠发送更新查询(它使我的类型工作并将更新查询到数据库“拆分”我的旧列到两个新列)。但我的目标是让每张唱片都成为这个迁移之王。我不能使用普通的数据库迁移,因为我的自定义类型中有一些逻辑。我想做这样的事情:

// here I persist all my entities
List<TestEntity> entities = entityRepository.findAll();
for (TestEntity entity : entities) {
   // This piece of code does nothing, because when hibernate merges two entities, it understands, that nothing changed, so it won't send update query. 
   entityRepository.save(entity);
}

但我希望他发送更新查询,尽管没有任何改变。此外,我希望这种休眠行为只在一个地方(例如,我将创建控制器来执行此数据库更新)。什么是我的问题的解决方案?有什么方法可以解决它吗?

标签: javahibernatespring-data-jpa

解决方案


我不明白你为什么需要它,但你需要将实体从会话中分离出来才能工作。

据我了解,您需要EntityManger

    @PersistenceContext
    private EntityManager entityManager;

    ...

    List<TestEntity> entities = entityRepository.findAll();
    for (TestEntity entity : entities) {
      entityManager.detach(entity);
      entityRepository.save(entity); // or entityManager.unwrap(Session.class).saveOrUpdate();
   }
   

请参阅Spring JpaRepository - 分离和附加实体


推荐阅读