【问题标题】:Save JPA Repository where "other attribute"将 JPA 存储库保存在“其他属性”的位置
【发布时间】:2018-01-03 13:41:33
【问题描述】:

我用的是弹簧靴。

执行时

oneJpaRepository.save(object) 如果不存在主键,则该对象保存它,如果存在,则更新该对象。

如何通过另一个不是主键的属性来更新这个对象?例如 oneJpaRepository.saveByCodigo(Object)

注意:我已经创建了一个函数 updateObjectByOtherAtributte 并且它可以工作,但我想知道是否有办法通过

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE Concepto c SET c.idBui = :#{#concepto.getIdBui()}," +
    "c.descripcion = :#{#concepto.getDescripcion()}," +
    "c.admiteReglas = :#{#concepto.getAdmiteReglas()}," +
    "c.tieneCantidadFija = :#{#concepto.getTieneCantidadFija()}," +
    "c.tieneValorFijo = :#{#concepto.getTieneValorFijo()}," +
    "c.vigencia = :#{#concepto.getVigencia()}," +
    "c.valor = :#{#concepto.getValor()}, " +
    "c.detalles = :#{#concepto.getDetalles()}" +
    " WHERE c.codigo = :#{#concepto.getCodigo()}")
int updateConcepto(@Param("concepto") Concepto concepto);

int resultadoUpdate = conceptoJpaRepository.updateConcepto(concepto);

  if (resultadoUpdate == 0){ conceptoJpaRepository.save(concepto)

【问题讨论】:

  • 请提供一些你已经完成的代码。
  • 我编辑答案。

标签: java hibernate spring-boot spring-data-jpa


【解决方案1】:

如果您在对象位于事务上下文中时对某个属性进行修改,则该对象将被更新。

你不需要调用oneJpaRepository.save()来更新对象,你只需要在一个事务中修改对象

通常在 Spring 应用程序中,您有一个声明事务的层服务,在该层内,您可以检索一个对象并设置新值。是这样的

@Transactional
void serviceMethod (Object c){

    Object bd = oneJpaRepository.findById(c.id)
    bd.setFoo(c.getFoo)

}

【讨论】:

    【解决方案2】:

    在使用 JPA 时不需要在对象上调用 save ,因为您希望保存的更改是在事务内部进行的持久性机制(更改是在事务开始之后和事务结束之前进行的)。

    这是由于 JPA 的行为称为 Transparent Persistence

    然而,使用 Spring Data JPA 时的 save 方法将确定对象是否是新的,如果是新的,它将使对象持久化(即在数据库上创建它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2020-07-30
      • 2010-11-23
      相关资源
      最近更新 更多