代码之家  ›  专栏  ›  技术社区  ›  Damien

如何判断JPA save方法执行了什么操作

  •  0
  • Damien  · 技术社区  · 6 年前

    我有回购协议:

    public interface SomeRepository extends CrudRepository<SomeClass, Long> {
        SomeClass findById(Long id);
    }
    

    我需要将对象保存到其中:

    SomeClass someClass = GetAMaybeNewSomeClass();
    someClass = someRepository.save(someClass);
    

    如何在代码中告诉save调用执行了什么操作?我需要知道数据库中是否已经存在某个类,如果它确实存在,我需要知道save调用是否实际更改了它。

    我可以通过在save操作之前调用findById并将我发现的内容与我正在保存的内容进行比较来实现这一点,但如果框架中有内置的内容,我宁愿使用它。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Dazak    6 年前

    这个 save 春季操作联合收割机 persist 以及 merge 方法 source code 该方法包括:

    @Transactional
    public <S extends T> S save(S entity) {
    
        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
    

    因此,当您调用 拯救 方法我认为是不可能的,所以如果您确实需要知道,您应该直接从JPA使用持久化和合并方法,或者创建您自己的方法。

    更新时间:

    您还可以使用 existsById 来自CrudRepository的方法

        2
  •  0
  •   Woodchuck    2 年前

    您可以使用MappedSuperClass基实体,该实体包含一个方法,该方法根据实体是否为新实体返回标志,遵循Spring文档中显示的模式 here