【问题标题】:Spring data jpa datatables: javax.persistence.EntityNotFoundException: Unable to find entitySpring data jpa datatables:javax.persistence.EntityNotFoundException:无法找到实体
【发布时间】:2021-05-15 17:44:01
【问题描述】:

我在我的项目中使用 spring jpa 数据表:

https://github.com/darrachequesne/spring-data-jpa-datatables

今天发生了一件奇怪的事情。
我的代码中有以下调用:

DataTablesOutput<Message> messages = datatableMessageRepository.findAll(input, null, spec);

几天前它工作正常,规范是将结果限制为指定用户。它今天停止工作(截至今天,所有用户的总记录为 23)。

它返回此消息:

DataTables warning: table id=messageTable - javax.persistence.EntityNotFoundException: Unable to find com.mycompany.dao.entity.Message with id 4680

数据库有记录 4680。

我打开了跟踪,我在日志中发现了这个:

[TRACE] 2019-02-11 04:08:56.390 [http-nio-127.0.0.1-8000-exec-5] DefaultLoadEventListener - Loading entity: [com.mycompany.dao.entity.Message#4680]
[TRACE] 2019-02-11 04:08:56.392 [http-nio-127.0.0.1-8000-exec-5] DefaultLoadEventListener - Attempting to resolve: [com.mycompany.dao.entity.Message#4680]
[TRACE] 2019-02-11 04:08:56.397 [http-nio-127.0.0.1-8000-exec-5] DefaultLoadEventListener - Object not resolved in any cache: [com.mycompany.dao.entity.Message#4680]
[TRACE] 2019-02-11 04:08:56.400 [http-nio-127.0.0.1-8000-exec-5] AbstractEntityPersister - Fetching entity: [com.mycompany.dao.entity.Message#4680]

然后是一个长查询, 然后是:

[TRACE] 2019-02-11 04:08:56.599 [http-nio-127.0.0.1-8000-exec-5] BasicBinder - binding parameter [1] as [BIGINT] - [4680]
[TRACE] 2019-02-11 04:08:56.603 [http-nio-127.0.0.1-8000-exec-5] AbstractLoadPlanBasedLoader - Bound [2] parameters total
[TRACE] 2019-02-11 04:08:56.827 [http-nio-127.0.0.1-8000-exec-5] ResourceRegistryStandardImpl - Registering result set [com.mysql.cj.jdbc.result.ResultSetImpl@d1d2cc5]
[TRACE] 2019-02-11 04:08:56.832 [http-nio-127.0.0.1-8000-exec-5] ResultSetProcessorImpl - Processing result set
[TRACE] 2019-02-11 04:08:56.836 [http-nio-127.0.0.1-8000-exec-5] ResultSetProcessorImpl - Done processing result set (0 rows)
[TRACE] 2019-02-11 04:08:56.842 [http-nio-127.0.0.1-8000-exec-5] AbstractRowReader - Total objects hydrated: 0

但有趣的是,如果我在数据表存储库的 findAll 调用之前调用 MessageRepository.findAll:

List<Message> all = mr.findByUser(user);
DataTablesOutput<Message> messages = datatableMessageRepository.findAll(input, null, spec);

然后查询成功了!

那是为什么呢?我错过了配置吗?

谢谢

【问题讨论】:

  • 展示您如何实现 datatableMessageRepository.findAll。标准方法最多有 2 个参数...
  • @Repository public interface DatatableMessageRepository extends DataTablesRepository&lt;Message, Long&gt; { }
  • 所以我没有覆盖任何东西。我还有其他数据表存储库,其中大多数只是扩展了 DataTablesRepository 并且没有问题。所以这真的很奇怪。

标签: java spring datatable spring-data-jpa spring-data


【解决方案1】:

它失败是因为 JPA 总是期望列中的值不是空值,并且加载期间的实体验证失败。您可能将 OneToMany / ManyToOne 连接到此列,这会导致实体无法加载,因为找不到关系的另一端。

【讨论】:

    【解决方案2】:

    好的,找到问题了。该行有一列是另一个表的外键,在 db 模式中,它设置为可为空,但在我的实体类中,它设置为 nullable=false。更改为 nullable=true 并且有效。但我不明白为什么?谁能给我解释一下?

    谢谢

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,在我的情况下,它是由 2 个实体之间的关系引起的。 通过将@ManyToOne 注释在子实体 更新为:

      修复
          @JoinColumn(nullable = false)
          @ManyToOne(optional = false, fetch = FetchType.LAZY)
          private ParentEntityClass parent;
      
      

      并且,除了上面的 @NotNull 注释之外(可能没有必要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-10
        • 2023-03-18
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2019-09-30
        • 1970-01-01
        相关资源
        最近更新 更多