如果调用 println,EntityManager 未找到引用在 try catch 中的行为不同

EntityManager not finding reference acts differently in try catch if calling println

我有一个端点,如下所示:

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteScooter(@PathVariable long id) {
    boolean isDeleted = scootersRepository.deleteById(id);
    if (!isDeleted) throw new ResourceNotFoundException("The scooter could not be found with id: " + id);
    return ResponseEntity.ok().build();
}

以及相关的deleteById方法:

@Transactional
@Override
public boolean deleteById(long id) {
    boolean isDeleted = false;
    try {
        Scooter scooterRef = entityManager.getReference(Scooter.class, id);
        System.out.println(scooterRef); // <--- this line here
        entityManager.remove(scooterRef);
        isDeleted = true;
    } catch (Exception e) {
        // no-op
    }
    return isDeleted;
}

如果我保留如上所示的代码并调用传入 unknown id 的删除端点,这将抛出 resourceNotFoundException(预期行为,到目前为止一切正常)

但是,如果我从 deleteById 方法中删除此特定行:

System.out.println(scooterRef); // <--- this line here

而是抛出 internalServerErrorException

我的问题是,这个 println 调用到底在做什么?是否有更简洁的解决方案来执行此代码的预期行为而不使用 println?


更新:

如果我删除 println 并尝试访问引用中的属性之一,也会出现预期的行为,如下所示:

// System.out.println(scooterRef);
scooterRef.getMileage(); // <-- ResourceNotFoundException is thrown, good

现在我隐约记得在某些情况下您需要以某种方式(例如通过调用属性)访问引用对象以使其完全加载或类似的东西,但我不记得确切的推理了。

您可以尝试使用 entityManager.find(Scooter.class, id);

然而,根据 this 博客的解释,即使 getReference 只有 returns 一个代理对象,删除它应该完全相同。