【问题标题】:Update request to DB even if nothing has changed in Entity即使实体中没有任何变化,也更新对 DB 的请求
【发布时间】:2021-06-29 10:57:52
【问题描述】:

我使用弹簧数据和休眠。我有一个实体(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);
}

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

【问题讨论】:

  • 我不明白,如果没有任何变化,为什么还要运行更新查询?
  • 我不明白的是,如果其中一个属性有新的映射逻辑,findAllsave 如何在您的示例中正常工作?
  • 另外,您使用的是什么数据库迁移工具?例如,Liquibase 允许您创建用 Java 编写的迁移,因此您可以在内部调用自定义逻辑并且仍然之后能够执行 SQL

标签: java hibernate spring-data-jpa


【解决方案1】:

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

据我了解,您需要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 - Detach and Attach entity

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2021-09-19
    • 2023-04-02
    • 2023-03-30
    相关资源
    最近更新 更多