我正在使用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]]
}
答案 0 :(得分:1)
您的测试似乎在某种程度上使用了分离的对象。第一步,findAll()将这些实体加载到会话中,但是然后步骤2而不是使用加载的实体,创建一个随后保存的新实体。 “附加”实体仍然引用该实体的早期版本。 OGM目前没有处理这个问题。
你最好修改findAll中加载的实体或只修改findOne(id),修改,保存(而不是通过设置id重新创建一个)。这将确保一切都是一致的。