Spring数据JPA数据表:javax.persistence.EntityNotFoundException:无法找到实体

时间:2019-02-11 09:53:18

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

我在我的项目中使用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);

然后查询有效!

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

谢谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

确定,找出问题所在。该行有一个列,该列是另一个表的外键,在db模式中,它设置为可为空,但是在我的实体类中,它设置为nullable = false。更改为nullable = true并起作用。但是我不明白为什么?有人可以给我解释一下吗?

谢谢

答案 2 :(得分:0)

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

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

而且,除了上面的这个 @NotNull 注释(可能没有必要