JPA和不赞成使用的getOne()和getById()->如何在getReferenceById中捕获实体未发现异常

h4cxqtbf  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(798)

在关于如何捕获EntityNotFoundException的其他类似问题中,主要提示是使用返回null的简单方法,如getOne
从spring-boot v 2.7 +开始,getOne()getById()都被标记为弃用,文档中说使用getReferenceById代替。
这个问题在其他一些问题中提到过,你不能简单地抓住javax.persistence.EntityNotFoundException
这是永远不会被抓住的:

fun getDonation(donationId: Long): DonationDto? {
  return try {
    val entity: DonationEntity = donationJpaRepository.getById(donationId)
    mapper.toDonationDto(entity)
  } catch (e : EntityNotFoundException) {
    null
  }
}

除了降级版本和继续我的生活,我如何捕获异常或处理未找到的实体?

abithluo

abithluo1#

看起来你可以在这种情况下抓住JpaObjectRetrievalFailureException
从文档到JpaObjectRetrievalFailureException
ObjectRetrievalFailureException的JPA特定子类。转换JPA的实体未找到异常。

return try {
   val dto = service.getStuff(id)
   ResponseEntity(dto, HttpStatus.OK)
} catch (e: JpaObjectRetrievalFailureException) {
   ResponseEntity("Nothing with id $id.", HttpStatus.NOT_FOUND)
}
mpgws1up

mpgws1up2#

您只能喜欢JpaRepository.getReferenceById(ID id)的javadoc
根据JPA持久性提供程序的实现方式,这很可能总是返回一个示例,并在第一次访问时抛出EntityNotFoundException。其中一些将立即拒绝无效的标识符。
如果你关心你的心理健康,使用CrudRepository.findById(),它保证如果找不到实体,将返回一个空的可选项,或者更好的方法是,使用EntityManager并抛弃spring jpa的抽象漏洞。
如果您需要加载多个实体,捕获该期望可能无法向客户端给予有关哪个实体加载失败的足够信息。我知道在这种情况下,它只是一个实体,但您可能会遇到需要加载多个实体的情况,使用一致的方法有助于长期维护代码。

相关问题