Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SpringDataNeo4j在NodeEntity中持久化映射(java.util.Map)对象?_Java_Neo4j_Spring Data_Spring Data Neo4j - Fatal编程技术网

如何使用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"));
    }