保存JPA存储库“其他属性”

时间:2018-01-03 13:41:33

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

我使用春季靴子。

执行时

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

如何通过不是主键的其他属性更新此对象?例如 oneJpaRepository.saveByCodigo(对象)

注意:我已经创建了一个函数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)

2 个答案:

答案 0 :(得分:0)

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

您不需要调用oneJpaRepository.save()来更新对象,您只需要修改事务中的对象

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

@Transactional
void serviceMethod (Object c){

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

}

答案 1 :(得分:0)

当使用JPA作为持久性机制时,没有必要调用对象的保存,其中您希望保存的更改是在事务内部进行的(更改是在tranasaction开始之后和transacton结束之前进行的)。

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

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