我尝试使用 Spring Data Neo4j (SDN) 将以下实体持久保存到 Neo4J 数据库中。该实体有一个属性 java.util.Map<CustomEnum,Instant>
.
检查以下示例代码:
public enum CustomEnum {
TREE, LEAVE, FLOWER;
}
@NodeEntity
public class ExampleEntity {
@Id
@GeneratedValue
private Long id;
// omitted simple properties of type String
@Properties(allowCast = true)
Map<CustomEnum,Instant> myMapProperty = new HashMap<>();
}
我遇到的问题是,Neo4J OGM 提示它无法保留 Map<CustomEnum, Instant>
因为类型不受支持。
org.neo4j.ogm.exception.core.MappingException:
我发现异常的来源来自 MapCompositeConverter
: Link to Github .
如果我的分析是正确的,那么核心问题在于 OGM 只允许 AbstractConfigurableDriver
中定义的默认 Cypher 类型。 : Link to Github
这将是一种不同的行为,如文档 here 中所述。 ,这解释了应该支持许多 native Java 类型(包括时间类型 Instant, LocalDate, Period
)。
如果有一个指向正确方向的指针,我会非常高兴。
预先感谢您的帮助。
最佳答案
Spring-Data-Neo4j 支持 String、Integer、Long 等基本类型。
还支持一些更复杂的类型,例如 Instant 和 Date,但这只是因为 Spring-Data-Neo4j 使用 OGM,它附带一组 AttributeConverters,可以将 Instant 和 Date 隐式转换为 String。
您可以定义自己的转换器并将它们放在 @Property
属性上以使用此转换器。
例如,您可以按如下方式构建 FooToStringConverter
:
public class FooToStringConverter implements AttributConverter<Foo, String>{
String convertToDatabaseColumn(Foo foo){
return foo.toString();
}
Foo convertToEntityAttribute(String fooString){
return Foo.fromString();
}
}
然后将您的实体注释为
@Property
@Converter(converter=FooToStringConverter.class)
private Foo foo;
然而,转换器的广泛使用有点破坏了 Neo4j 所获得的遍历图表的优势,因为现在您需要使用索引。 它会以这种方式工作,但也许您需要过度考虑架构以使用更多节点而不是嵌入式完整属性。
希望这有帮助。
关于java - Neo4j OGM @Properties 支持哪些条目类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390060/