1

我正在使用 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"]

当我重新启动我的网络服务器时它会正常工作。

【改变价值的方法】

@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]]

}
4

1 回答 1

1

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

您最好修改 findAll 中加载的实体或仅修改 findOne(id)、修改、保存(而不是通过设置 id 重新创建一个)。这将确保一切都是一致的。

于 2015-08-13T04:41:06.613 回答