Spring 数据 Neo4j 覆盖属性
Spring Data Neo4j overwrites attributes
我尝试编写一个服务,使用 SDN 4.0.0 具有 update(User)
功能。
该函数应该看起来,如果数据库中有一个具有相同 ID 的用户,如果有,则用新用户覆盖该用户。
有一个扩展 GraphRepository<User>
的 UserRepository
我写了下面的代码:
User updateUser(User user){
if(userRepository.findOne(user.getId())!=null){
user = userRepository.save(user);
return user;
}else{
//Exception handling here
}
}
我现在遇到了问题,我更新的每个用户都保持数据库中的状态,因为从那一刻起,调用 findOne(id)
,用户对象的所有属性都会被用户覆盖它在数据库中。
我已经解决了这个问题,方法是在存储库中添加一个 existsById(Long id)
函数并用查询 "Match (n:User) where ID(n)={0}".
注释
但是,我仍然很感兴趣,为什么 SDN 会覆盖与我试图获取的对象具有相同 ID 的对象。我假设有参考文献,但我真的看不出它的优点。
这是设计使然,当您从数据库中加载一个实体时,它是图表中的最新版本,因此会覆盖任何未保存的更改。
如果您更改操作顺序 - 先加载,如果存在,然后修改并保存 - 应该没问题。
我尝试编写一个服务,使用 SDN 4.0.0 具有 update(User)
功能。
该函数应该看起来,如果数据库中有一个具有相同 ID 的用户,如果有,则用新用户覆盖该用户。
有一个扩展 GraphRepository<User>
的 UserRepository
我写了下面的代码:
User updateUser(User user){
if(userRepository.findOne(user.getId())!=null){
user = userRepository.save(user);
return user;
}else{
//Exception handling here
}
}
我现在遇到了问题,我更新的每个用户都保持数据库中的状态,因为从那一刻起,调用 findOne(id)
,用户对象的所有属性都会被用户覆盖它在数据库中。
我已经解决了这个问题,方法是在存储库中添加一个 existsById(Long id)
函数并用查询 "Match (n:User) where ID(n)={0}".
但是,我仍然很感兴趣,为什么 SDN 会覆盖与我试图获取的对象具有相同 ID 的对象。我假设有参考文献,但我真的看不出它的优点。
这是设计使然,当您从数据库中加载一个实体时,它是图表中的最新版本,因此会覆盖任何未保存的更改。
如果您更改操作顺序 - 先加载,如果存在,然后修改并保存 - 应该没问题。