如果调用 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 一个代理对象,删除它应该完全相同。
我有一个端点,如下所示:
@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 一个代理对象,删除它应该完全相同。