【问题标题】:EntityNotFoundException: Unable to find Child class with id 5 on OneToOne MappingEntityNotFoundException:无法在 OneToOne 映射上找到 ID 为 5 的子类
【发布时间】:2019-04-01 21:30:35
【问题描述】:

我最初开始在我的@OneToOne 映射场景中解决 N+1 选择问题,我终于能够将多个选择查询减少到一个。我尝试使用 EntityGraphs 来解决 N+1 问题,但它不起作用。所以我将我的@OneToOne 映射更改为 LAZY,方法是将 fetch Type 设置为 Lazy 并设置 Optional=false。 我正在使用 Hibernate JPA。

我做了如下修改

Public Class Parent {

  @OneToOne(
      optional = false,
      mappedBy = "parent",
      fetch = FetchType.LAZY,
      cascade = {CascadeType.ALL})
  @NotFound
  private Child child;
}

在我的孩子类中,

Public Class Child {

  @Id
  private String Id;

  @OneToOne
  @PrimaryKeyJoinColumn
  private Parent parent;

}

Repository 类如下,

public interface ParentChildRepository extends PagingAndSortingRepository<Transaction, String> {


  @EntityGraph(value = "Parent.EntityGraph", type = EntityGraphType.LOAD)
  default List<Transaction> findall() {
    return StreamSupport.stream(findAll().spliterator(), false).collect(Collectors.toList());
  }
}

如果没有 optional = false,LazyLoading 不起作用,我会得到 N+1 Select 查询语句,但是当我设置 optional = false 时, 抛出 EntityNotFoundException 异常。当 optional=false 语句被删除/设置为 true 时,不会引发 EntityNotFoundException,但它不能解决我的 N+1 选择问题。

请提供一些建议。

【问题讨论】:

    标签: java hibernate spring-mvc spring-boot jpa


    【解决方案1】:

    尝试使用未找到的忽略,如下所示。

    @NotFound(action = NotFoundAction.IGNORE)

    参考this

    【讨论】:

    • 你好@Alien 我在我的父类上尝试了上述注释。这不起作用,我得到与以前相同的错误。 javax.persistence.EntityNotFoundException。找不到 ID 为 Model.Child
    • 我能够通过在有效负载中发布丢失的子实体信息然后尝试检索它来解决上述异常。我知道上述错误是有效的,这是我设置 optional = false 的错误在@OneToOne Lazy fetch 中。在我的子实体类的场景中,空值是可能的,所以当我设置 optinal=false 时,我会通知 hibernate 生成一个代理(确认空值是不可能的,即使它不是)。我仍然不确定为什么双向一对一映射会生成 N+1 选择,即使使用 Lazy 或 Eager fetching 也是如此。
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2020-05-02
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多