Spring 引导:org.hibernate.MappingException:未知实体

Spring Boot: org.hibernate.MappingException: Unknown entity

我正在为我的个人博客编写一个关于如何使用 Spring 从头开始​​启动的示例项目。此刻试图将我的实体保存在 H2 数据库上,我从 class BulkController 收到此映射异常,它是 RestController class 试图保存我的 Document POJO class.

这里是使用双括号初始化的GET方法的代码:

Iterable<Document> records = csvParser.getRecords()
        .stream()
        .skip(1)
        .map(record -> new Document() {{
            setSource(record.get(0));
            setCodeListCode(record.get(1));
            setCode(record.get(2));
            setDisplayValue(record.get(3));
            setLongDescription(record.get(4));
        }})
        .collect(Collectors.toList());

documentRepository.saveAll(records);

正在检查引发的异常:

org.hibernate.MappingException: Unknown entity: com.josephrodriguez.learning.springboot.controller.BulkController
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:704) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1608) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:149) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:99) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]

我的某些部分对检查可迭代项的 class 感到有些好奇。

    for (Document d: records) {
        System.out.println(d.getClass());
    }

如我所料,这是输出:

class com.josephrodriguez.learning.springboot.controller.BulkController

删除 map 功能的使用一切正常。

问题:为什么带有双括号初始化的map函数改变了集合预期项目的class类型?

new Document() {...} 是一个匿名的 class,因为我想你的代码是在 ...BulkController 中执行的,所以它被称为 ...BulkController,因此 Hibernate 不会将其识别为托管类型。不管是 new Document {} 还是 new Document {{}}.

Document class 实施足够的 constuctor/wither/builder/setter 功能,一切都应该正常工作。

例如。使用 lombok.Builder:

@Builder
public class Document {...}


...
    Iterable<Document> records = csvParser.getRecords()
        .stream()
        .skip(1)
        .map(record ->
             Document.builder()
                 .source(record.get(0))
                 .codeListCode(record.get(1))
                 .code(record.get(2))
                 .displayValue(record.get(3))
                 .longDescription(record.get(4))
                 .build()
        )
        .collect(Collectors.toList());

    documentRepository.saveAll(records);

P.S。不知道你是如何移除 map 的,但是 JpaRepository<Document, ID> 总是需要一个 Iterable<Document> 参数。

我的回答:org.hibernate.MappingException: Unknown entity异常发生是因为持久性上下文不管理 BulkController$1。

就像上面提到的 Serg Vasylchak,{{ }}(双括号)创建了一个匿名的 class 派生外部 class。前任。批量控制器。但是持久性上下文不知道 Bulkcontroller 的类型。

因此,当您删除 map 逻辑时它会起作用,因为双括号初始化位于 map 中。为什么不通过 Serg Vasylchark 推荐的 builder 创建文档 class?