NodeEntity缓存Set

时间:2015-08-12 09:52:55

标签: java neo4j spring-data-neo4j spring-data-neo4j-4

我正在使用Spring Data Neo4j 4.似乎Neo4j的“PersistenceContext”缓存了“Set”值的值。

实体

@NodeEntity
public class ServiceStatus implements java.io.Serializable {

    @GraphId Long id;

    private Set<String> owners = new HashSet<String>();

}

首先,我在所有者中添加了值“ROLE_ADMIN”并保存。 然后我将值编辑为“ROLE_SYSTEM_OWNER”并再次调用save()。

在Neo4j查询浏览器中,它只显示“ROLE_SYSTEM_OWNER”,现在这一切都是正确的。

但是,当我调用findAll()时,所有者有两个值[“ROLE_ADMIN”,“ROLE_SYSTEM_OWNER”]

重新启动Web服务器时,它会正常工作。

[改变价值的方式]

@Test
public void testSaveServiceStatus() throws OSPException {
    //1. save 
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.setServiceName("My Name");

    Set<String> owners = new HashSet<String>();
    owners.add("ROLE_SITE_ADMIN");
    serviceStatus.setOwners(owners);

    serviceStatusRepository.save(serviceStatus);

    System.out.println(serviceStatus.getId()); //262

}

@Test
public void testEditServiceStatus() throws OSPException{
    //1. to find all , it seems cache the set value
    serviceStatusRepository.findAll();


    //2. simulate the web process behavior
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.setId(new Long(262));
    serviceStatus.setServiceName("My Name");

    Set<String> owners = new HashSet<String>();
    //change the owner to Requestor
    owners.add("Requestor");
    serviceStatus.setOwners(owners); 

    //3. save the "changed" value 
    // In the cypher query browser, it show "Requestor" only
    serviceStatusRepository.save(serviceStatus);

    //4. retrieve it again
    serviceStatus = serviceStatusRepository.findOne(new Long(262));

    System.out.println(serviceStatus); //ServiceStatus[id=262,serviceName=My Name,owners=[Requestor5, Requestor4]]

}

1 个答案:

答案 0 :(得分:1)

您的测试似乎在某种程度上使用了分离的对象。第一步,findAll()将这些实体加载到会话中,但是然后步骤2而不是使用加载的实体,创建一个随后保存的新实体。 “附加”实体仍然引用该实体的早期版本。 OGM目前没有处理这个问题。

你最好修改find​​All中加载的实体或只修改find​​One(id),修改,保存(而不是通过设置id重新创建一个)。这将确保一切都是一致的。