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?
我正在为我的个人博客编写一个关于如何使用 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?