当前位置: 首页 > 知识库问答 >
问题:

如何更新Spring数据neo4j中的节点或节点实体?

乐正乐湛
2023-03-14

在SpringDataNeo44中,我们只有存储库。保存(实体),但例如,当我的UserEntity的属性(电子邮件)更改时,我不知道如何更新该属性。

我也尝试使用neo4j模板,但使用现有节点id保存实体会导致下面的回滚。

org.springframework.dao.InvalidDataAccessApiUsageException: New value must be a Set, was: class java.util.ArrayList; nested exception is java.lang.IllegalArgumentException: New value must be a Set, was: class java.util.ArrayList
    at org.springframework.data.neo4j.support.Neo4jExceptionTranslator.translateExceptionIfPossible(Neo4jExceptionTranslator.java:43)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)

如何更新节点或节点属性?

public void updateUserNode(UserEntity user) {  
    try{ 
    UserEntity updatedUser = this.getUserByUserId(user.getUserId());//finding node with user id///
    updatedUser.setEmail(user.getEmail());
    updatedUser.setImageId(user.getImageId());
    updatedUser.setFirstname(user.getFirstname());
    updatedUser.setLastname(user.getLastname());
    //System.out.println("Deleting ");
    //userRepository.delete(del);
    System.out.println("UPDATING ");     
    // with existing Id, you can not save it again/, or update
    updatedUser = userRepository.save(updatedUser);
    }catch(Exception e){
      e.printStackTrace();
    }
    //return 
  }

共有3个答案

刘高驰
2023-03-14

因为您使用的是SDN,所以不需要手动启动/提交任何事务。

假设您的User类如下所示

@NodeEntity(label="User)
public class User extends DomainObject{
    @Property(name = "email")
    private String email;

    //getter and setter
}

并且您的UserRepository类似于以下内容:

public interface UserRepository extends GraphRepository<User> {

    //maybe this is already right at hand by SDN and thus redundant?
    @Query("MATCH (u:User {email:{email}}")
    public User findByEmail(@Param("email") String email)
}

然后您可以在UserService类上使用@Transactional

@Component
@Transactional
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void updateEmail(String email) {
        User user = userRepository.findByEmail(email);
        if (user == null) return; //or throw...
        user.setEmail(email);
        userRepository.save(user);
    }
}
公良鸿风
2023-03-14

在您的UserEntity域对象中,您是否存储了任何关系?确保它们被声明为Set

来自:http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#reference:programming_model:关系:相关

也可以有引用一组节点实体(1:N)的字段。这些字段有两种形式,可修改或只读。可修改字段的类型为set,只读字段的类型为Iterable,其中T是@NodeEntity注释类

我怀疑您的默认构造函数正在实例化ArrayList。。。

宣熙云
2023-03-14

您必须在事务中嵌入。

作为一个例子:

final org.neo4j.graphdb.Transaction tx = this.neoTemplate.getGraphDatabaseService().beginTx();
try {
    updatedUser = userRepository.save(updatedUser);
    tx.success();
} finally {
    tx.finish();
}
 类似资料:
  • 我正在使用Neo4j的最新Spring数据。在这个项目中,我有不同的组,它们可以通过url/group/{id}/project访问,该url/group/{id}/project应该返回用户有权访问的所有项目的列表。这东西工作得很好,但是如果用户输入了一个很大的数字作为groupId,而这个数字在数据库中并不存在,我会得到一个 组织。neo4j。图b。NotFoundException:未找到节

  • 我使用的是Spring数据Neo4j 3.3。1.2与Neo4j服务器一起发布。3. 我的问题是有一些节点是我的实体的副本,但它只有索引属性。 我的班级看起来像这样 当一个新节点被创建时,我首先检查是否有一个现有的节点,如果它存在就更新它,否则创建一个新的节点。 存储库接口。 在Neo4j中,实体被创建到具有所有属性的节点。但是有些节点也有一个只包含productId的重复节点。问题是这并没有发生

  • SyntaxError:无效输入“h”:预期为“I/I”(第10行,第28列(偏移量:346))“merge(p:primaryconsumer),其中p.name=svc.name” 我100%确信这些名称是唯一的,并且将与现有节点集中的唯一使用者名称相匹配(有待观察)。 当唯一节点属性匹配时,如何将现有属性添加到新数据中?(我希望获得唯一的ID,但我必须能够在匹配上执行新数据的更新)

  • 我在一个数据帧中有一个数据结构,它有3列:节点、父节点、前一个兄弟节点 我想创建完整数据结构的树文件夹,父节点和节点之间的级别不同,节点和previous_sibling之间的级别相同,兄弟节点之间的顺序正确。 因此,一个新的数据框、重新排序和一个新的列“级别” 当parent为null时,节点处于根级别当previous_sibling为null时这是第一个同级 下面是一个例子: 数据帧 应给出

  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?

  • 我的Firebase数据库映像在Firebase的实时数据库中,我正在尝试访问父节点的名称,并给出了子节点的名称。但是,.parent似乎需要对子节点的引用,如果没有父节点的名称,我似乎无法获得子节点的引用。 这是我的数据的代码: 问题出在like函数中:如果我能找到一种方法来获取发tweet(参数t表示的tweet)的人的userId,那么第一个var y和所有这些都是不必要的。 如果我可以得到