我正在使用neo4j ogm版本2.1.1,在对两个相同类型的类之间的关系进行建模时收到以下错误:
AmbiguousBaseClassException:在类型层次结构中找到映射到的多个类:[Package, Namespace, TypedElement, PackageableElement, NamedElement, Element, NetworkNode]
我的方案是我有多个实现 PackageableElement 接口的类,例如包和类。PackageableElement 的关系可以有一个或多个 PackageableElements 退出。
例如。包包含许多类。这种关系似乎可以正常,但在检索时抛出上述错误。
阅读文档,如果我了解了"关系中的歧义"问题,我就修改了在这种情况下使用 Package 的关系,以使用"无定向"类型,以便关系可以在两个方向上导航。这并没有解决问题。我在下面粘贴了 3 个域对象来显示我的关系。
该结构是从命名空间继承的包,它实现了具有方法和注释的 PackageableElement 接口: @org.neo4j.ogm.annotation.Relations(type = "HasPackageableElement", direction = org.neo4j.ogm.annotation.Relations.UNDIRECTED) public Set getPackageableElements();
包实体
@NodeEntity
@JsonTypeName("Package")
public class Package extends Namespace {
public String getURI() {
return URI;
}
public void setURI(String URI) {
this.URI = URI;
}
String URI;
@Override
public Integer getSequence() {
return sequence;
}
@Override
public void setSequence(Integer sequence) {
this.sequence = sequence;
}
@Index
Integer sequence;
}
命名空间类
@NodeEntity
public class Namespace implements PackagebleElement {
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@GraphId
private Long id;
@Override
public Set<Comment> getComments() {
return comments;
}
@Override
public void setComments(Set<Comment> comments) {
this.comments = comments;
}
private Package owningPackage;
@Override
public Package getOwningPackage() {
return owningPackage;
}
@org.neo4j.ogm.annotation.Relationship(type = "HAS_COMMENT", direction = org.neo4j.ogm.annotation.Relationship.OUTGOING)
Set<Comment> comments;
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Index
private String name;
@Override
public VisibilityKindEnum getVisibility() {
return visibility;
}
@Override
public void setVisibility(VisibilityKindEnum visibility) {
this.visibility = visibility;
}
private VisibilityKindEnum visibility;
Object type;
@Override
public Object getType() {
return type;
}
@Override
public void setType(Object type) {
this.type = type;
}
@Override
public Integer getSequence() {
return sequence;
}
@Override
public void setSequence(Integer sequence) {
this.sequence = sequence;
}
@Index
Integer sequence;
public static enum ElementTypeEnum {
Class,
Package;
}
@Override
public Set<PackageableElement> getPackageableElements() {
if (packageableElements == null)
packageableElements = new HashSet<PackageableElement>();
return packageableElements;
}
@org.neo4j.ogm.annotation.Relationship(type = "HasPackageableElement", direction = Relationship.UNDIRECTED)
public void setPackageableElements(Set<PackageableElement> packageableElements) {
this.packageableElements = packageableElements;
}
@org.neo4j.ogm.annotation.Relationship(type = "HasPackageableElement", direction = Relationship.UNDIRECTED)
Set<PackageableElement> packageableElements;
}
可打包元素类
@NodeEntity
public interface PackageableElement extends NamedElement {
@org.neo4j.ogm.annotation.Relationship(type = "HasPackageableElement", direction = org.neo4j.ogm.annotation.Relationship.UNDIRECTED)
public Set<PackageableElement> getPackageableElements();
public Integer getSequence();
public void setSequence(Integer sequence);
}
我已经在 ogm 中调试了元数据类的解析方法,这对我来说似乎是一个错误。读到的行 if (taxonClassInfo.isInterface()) { LOGGER.debug("标签位于接口上。寻找一个实现类..."); taxonClassInfo = findSingleImplementor(taxon);
findSingleImplementor 方法返回的结果是,我有一个接口扩展另一个接口。在我的方案中,NamedElement 接口扩展了 Element 接口。然后,这会将> 1 条目添加到解析的数组中,然后抛出错误。
这是正确的行为吗?我认为它应该寻找具体的实现。
在我的工作项目中进行了一些重构后,我有一个例外AmbiguousBaseClassException
使用 neo4j-ogm 版本 2.1.2。
我发现对于我的特定问题,扫描了具体的类,但没有扫描泛型类,即当我创建SessionFactory
时,我列出的包不包含基类。
特别是我有一个名为BaseObject
(基类)的类。它由混凝土类Person
扩展。
添加包含BaseObject
的包后,在创建SessionFactory
时,异常消失了。