【问题标题】:Load complete object after refresh with Spring Data使用 Spring Data 刷新后加载完整对象
【发布时间】:2019-11-29 09:29:48
【问题描述】:

我在运行更新后加载对象的所有属性时遇到问题。我的项目正在使用 Spring Boot 和 Spring 数据。 我的班级是这样配置的:

@Entity
@Table(name = "clientes")
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    @Column(name = "cadastro", nullable = false, updatable = false)
    private LocalDate cadastro;
    private String nome;
    private String ramoDeAtuacao;

    // get() e set()
}

我的仓库:

@Repository
public interface ClienteRepository extends JpaRepository<Cliente, Long> {
}

请注意,当我使用 Save 方法创建新 Cliente 时,只会生成一次注册日期。此操作发生在我的 Service 中:

@Service
public class ClienteServiceImpl implements ClienteService {
    private ClienteRepository repository;

    @Autowired
    public ClienteServiceImpl(ClienteRepository repository) {
        this.repository = repository;
    }


    @Override
    public Cliente save(Cliente cliente) {
        cliente.setCadastro(LocalDate.now());
        return repository.save(cliente);
    }

    @Override
    public Cliente update(Cliente cliente) {
        return repository.save(cliente);
    }
}

我的控制器:

@RestController
@CrossOrigin
@RequestMapping(path = "/clientes")
public class ClienteController {

    @Autowired
    private ClienteService service;

    @PutMapping
    public ResponseEntity<?> atualiza(@RequestBody Cliente cliente) {
        Cliente clienteAtualizado = service.atualiza(cliente);
        return new ResponseEntity<Cliente>(clienteAtualizado, HttpStatus.OK);
    }
}

这是为创建新客户端而发送的 JSON。

{
    "nome": "Thiago",
    "ramoDeAtuacao": "T.I."
}

返回的JSON有注册日期是这样的:

{
    "id": 1,
    "cadastro": "20/07/2019",
    "nome": "Thiago",
    "ramoDeAtuacao": "T.I."
}

现在,当我尝试升级时,我无法返回注册日期。这是更新的 JSON:

{
    "id": 1,
    "nome": "Thiago MF",
    "ramoDeAtuacao": "Desenvolvedor"
}

返回的JSON没有注册日期,返回NULL:

{
    "id": 1,
    "cadastro": null,
    "nome": "Thiago MF",
    "ramoDeAtuacao": "Desenvolvedor"
}

如何解决?

【问题讨论】:

  • 您使用的是 Spring Data Rest 自动生成的端点吗?如果没有,请添加您的控制器代码。还有你是怎么更新的。如果使用 SDR,则发送 PATCH 请求,因为您不包括所有字段。
  • 您好艾伦·海,感谢您的留言。我添加了我的控制器类代码,我目前正在使用@PostMapping。我将检查 Path 的使用。至于问题,它不再发生。我听从了毗湿奴的建议,它奏效了。

标签: hibernate jpa spring-data-jpa spring-data spring-data-rest


【解决方案1】:

您的更新查询没有日期字段,因此数据库中的现有字段将更新为 null。

如果您只需要更新日期字段以外的字段,则更新功能应该类似于

@Override
public Cliente update(Cliente cliente) {

    Cliente c = repository.findOne(id);
    // Now set the values to be updated on c from cliente
    return repository.save(c);
}

【讨论】:

  • 如果服务是事务性的(应该如此),则不需要 repository.save()
  • 你好毗湿奴。我听从了这个建议,它奏效了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 2019-01-14
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2015-10-30
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多