如何使用SpringDataNeo4j在NodeEntity中持久化映射(java.util.Map)对象?
我需要保存一个如何使用SpringDataNeo4j在NodeEntity中持久化映射(java.util.Map)对象?,java,neo4j,spring-data,spring-data-neo4j,Java,Neo4j,Spring Data,Spring Data Neo4j,我需要保存一个映射当我填充包含节点的类时,该节点被保存,但映射没有保存 下面是我为实体使用的代码 @NodeEntity public class UserAlias{ @GraphId private Long id; @Fetch private Map<IdentityType,List<Permission>> aliases; private String nam
映射
当我填充包含节点的类时,该节点被保存,但映射没有保存
下面是我为实体使用的代码
@NodeEntity
public class UserAlias{
@GraphId
private Long id;
@Fetch
private Map<IdentityType,List<Permission>> aliases;
private String name;
}
......
userAliasRepo.save(userAlias)
这在3.x版本中不受支持: 目前不支持Set以外的其他集合类型,当前也不支持任何
Map
如@frant.hartm所述 目前还不支持Set以外的其他集合类型 目前没有地图> 但是可以使用
org.springframework.data.neo4j.fieldaccess.DynamicProperties
来代替映射到节点属性的映射。唯一的折衷是,这只支持基本数据类型及其对应的数组
@NodeEntity
public class Person {
@GraphId
private Long graphId;
private DynamicProperties personalProperties;
public void setProperty(String key, Object value) {
personalProperties.setProperty(key, value);
}
public Object getProperty(String key) {
return personalProperties.getProperty(key);
}
}
@Test
public void testCreateOutsideTransaction() {
Person p = new Person("James", 35);
p.setProperty("s", "String");
p.setProperty("x", 100);
p.setProperty("pi", 3.1415);
persist(p);
assertEquals(3, IteratorUtil.count(p.getPersonalProperties().getPropertyKeys()));
assertProperties(nodeFor(p));
p.setProperty("s", "String two");
persist(p);
assertEquals("String two", nodeFor(p).getProperty("personalProperties-s"));
}
那么,还有其他选择吗?取决于您想要实现的图形模型。一种可能是将IdentityType设置为关系实体。
DynamicProperties
在Spring数据Neo4j 4.x上不再存在。是否存在将动态属性映射到Neo4j上节点的变通方法或新做法?@Gilbertotorezan作为替代方法,您可以将数据序列化为字符串,或者将映射作为图形模式本身进行图形化。但是,对于大型数据,最好将其保存到某个文件存储中,并且只在Neo4j中保留对它的引用(大型属性值会降低数据库的性能)。
@NodeEntity
public class Person {
@GraphId
private Long graphId;
private DynamicProperties personalProperties;
public void setProperty(String key, Object value) {
personalProperties.setProperty(key, value);
}
public Object getProperty(String key) {
return personalProperties.getProperty(key);
}
}
@Test
public void testCreateOutsideTransaction() {
Person p = new Person("James", 35);
p.setProperty("s", "String");
p.setProperty("x", 100);
p.setProperty("pi", 3.1415);
persist(p);
assertEquals(3, IteratorUtil.count(p.getPersonalProperties().getPropertyKeys()));
assertProperties(nodeFor(p));
p.setProperty("s", "String two");
persist(p);
assertEquals("String two", nodeFor(p).getProperty("personalProperties-s"));
}