java - 为什么 Spring Data 存储库上的 getOne(...) 不会抛出 EntityNotFoundException?

标签 java spring jpa spring-data spring-data-jpa

我正在处理一个奇怪的问题,我正在做集成测试,调用我的 Controller 从数据库中获取一个不存在的对象。

public Optional<T> get(Long id) {

  try {
    return Optional.ofNullable(repository.getOne(id));
  } catch(EntityNotFoundException e) {
    return Optional.empty();
  }
}

getOne(…) 找不到任何东西时,我期待 EntityNotFoundException 但实际上什么也没有。如果我检查我的结果,我可以看到我有一个带有指向它的处理程序链接的空实体“抛出 EntityNotFoundException”,但我们没有进入 catch 并且我返回这个奇怪实体的可选。

我无法理解这种行为。

最佳答案

这是由于 JPA 指定 EntityManager.getReference(…) 的方式造成的。去工作。它应该返回一个代理,该代理将解析在第一次访问属性时返回的对象或最终抛出包含的异常。

解决此问题的最简单方法是简单地使用 findOne(…)相反,像这样 Optional.ofNullable(repository.findOne(…)) . findOne(…)将返回 null如果没有找到结果。

解决此问题的更高级方法是使存储库返回 Optional直接实例。这可以通过使用 Optional<T> 创建自定义基础存储库接口(interface)来实现。作为 find… 的返回类型-方法。

interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

  Optional<T> findOne(ID id);

  // declare additional methods if needed
}

interface YourRepository extends BaseRepository<DomainClass, Long> { … }

Spring Data examples repository 中找到完整的示例.

关于java - 为什么 Spring Data 存储库上的 getOne(...) 不会抛出 EntityNotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264758/

相关文章:

java - Java 6 中的 URL 解码

java - 如何在 Joda Time 上计算带负号的 2 个周期的总和

java - Rest Facade 将 xml 映射到 json

java - JPA 持久保存来自多对多关系的已持久对象

Java - Cron 作业 - 如果一个实例触发批处理作业,则阻止其他实例执行相同的操作

java - 过滤 TIMESTAMP 的 TIME 部分不起作用(JPA2、HIBERNATE)

java使用线程下载多个文件

java - 从 SQLiteDatabase 中删除一个元素是否会反射(reflect)其他元素 ID 的变化?

java - 在不使用适配器模式的情况下扩展 spring mvc Controller

java - Spring initializr 生成的 Spring Boot 应用程序在 Eclipse 上运行时出错