entitymanager找不到引用在try-catch中的行为不同

nkhmeac6  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(278)

我有一个端点,看起来像这样:

@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;
}

如果我像上面所示那样保留代码,并调用delete端点传入 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

现在我确实模模糊糊地记得,在某些情况下,您需要以某种方式(例如,通过调用属性)访问引用的对象,以使其完全加载或诸如此类的内容,但我不记得确切的推理了。

gg0vcinb

gg0vcinb1#

你可以试着用 entityManager.find(Scooter.class, id) ;
但是从这个博客的解释来看 getReference 只返回一个代理对象,删除时应该完全一样。

相关问题