org.neo4j.ogm.exception.core.MappingException: 不止一个 class 有简单的名字
org.neo4j.ogm.exception.core.MappingException: More than one class has simple name
我创建了 2 个 classes,它们具有相同的 ClassName 但在不同的包中并且具有不同的 NodeEntity 标签。我面临以下 OGM 映射异常,仅当使用 @Query.
调用存储库方法时
Caused by: org.neo4j.ogm.exception.core.MappingException: More than one class has simple name: Circuit
at org.neo4j.ogm.metadata.DomainInfo.getClassInfo(DomainInfo.java:307)
at org.neo4j.ogm.metadata.DomainInfo.getClassSimpleName(DomainInfo.java:289)
at org.neo4j.ogm.metadata.MetaData.classInfo(MetaData.java:78)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.lambda$executeAndMap(ExecuteQueriesDelegate.java:119)
at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:574)
at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:553)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.executeAndMap(ExecuteQueriesDelegate.java:118)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.query(ExecuteQueriesDelegate.java:88)
at org.neo4j.ogm.session.Neo4jSession.query(Neo4jSession.java:408)
在调试时,我发现 executeAndMap 方法在 org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate class 使用 Class SimpleName,而不是分配的标签,找到 Class信息,这是导致问题的原因。
具有相同简单名称的 classes 存在于不同的包中,具有不同的标签并映射到不同的存储库接口。 Neo4jSession.loadAll 按预期工作,因为它使用 class 全限定名来获取 Class信息
private <T> Iterable<T> executeAndMap(Class<T> type, String cypher,
Map<String, ?> parameters, ResponseMapper mapper) {
return session.<Iterable<T>>doInTransaction( () -> {
if (type != null && session.metaData().classInfo(type.getSimpleName()) != null) {
预期:用于获取 ClassInfo 的 NodeEntity 标签。
实际:Class SimpleName 用于获取 ClassInfo。
使用 Class FullQualifiedName 获取 ClassInfo 效果很好。
已修复。参考如下,
Mapping Exception for entities with same Simple ClassName but different Labels
我创建了 2 个 classes,它们具有相同的 ClassName 但在不同的包中并且具有不同的 NodeEntity 标签。我面临以下 OGM 映射异常,仅当使用 @Query.
调用存储库方法时Caused by: org.neo4j.ogm.exception.core.MappingException: More than one class has simple name: Circuit
at org.neo4j.ogm.metadata.DomainInfo.getClassInfo(DomainInfo.java:307)
at org.neo4j.ogm.metadata.DomainInfo.getClassSimpleName(DomainInfo.java:289)
at org.neo4j.ogm.metadata.MetaData.classInfo(MetaData.java:78)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.lambda$executeAndMap(ExecuteQueriesDelegate.java:119)
at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:574)
at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:553)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.executeAndMap(ExecuteQueriesDelegate.java:118)
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.query(ExecuteQueriesDelegate.java:88)
at org.neo4j.ogm.session.Neo4jSession.query(Neo4jSession.java:408)
在调试时,我发现 executeAndMap 方法在 org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate class 使用 Class SimpleName,而不是分配的标签,找到 Class信息,这是导致问题的原因。
具有相同简单名称的 classes 存在于不同的包中,具有不同的标签并映射到不同的存储库接口。 Neo4jSession.loadAll 按预期工作,因为它使用 class 全限定名来获取 Class信息
private <T> Iterable<T> executeAndMap(Class<T> type, String cypher,
Map<String, ?> parameters, ResponseMapper mapper) {
return session.<Iterable<T>>doInTransaction( () -> {
if (type != null && session.metaData().classInfo(type.getSimpleName()) != null) {
预期:用于获取 ClassInfo 的 NodeEntity 标签。
实际:Class SimpleName 用于获取 ClassInfo。
使用 Class FullQualifiedName 获取 ClassInfo 效果很好。
已修复。参考如下,
Mapping Exception for entities with same Simple ClassName but different Labels