我尝试使用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<>();
}
我遇到的问题是,由于不受支持的Type,Neo4J OGM抱怨它无法保留Map<CustomEnum, Instant>
。
org.neo4j.ogm.exception.core.MappingException:
我找到了来自MapCompositeConverter
:Link to Github的异常源。
如果我的分析是正确的,则核心问题在于OGM仅允许使用AbstractConfigurableDriver
:Link to Github
这与文档here中说明的行为不同,该文档说明应该支持许多本机Java类型(包括临时类型Instant, LocalDate, Period
)。
我对正确方向的指针感到非常高兴。
预先感谢您的帮助。
答案 0 :(得分:0)
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;
但是,广泛使用Converters有点抵消了Neo4j所带来的Traverse-The-Graph优势,因为现在您需要使用索引。 这样就可以了,但是也许您需要考虑一下架构以使用更多的节点而不是嵌入式compley属性。
希望这会有所帮助。