Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SpringBoot与Neo4J一起使用:更新节点会创建重复的节点_Java_Spring Boot_Neo4j_Spring Data Neo4j 4 - Fatal编程技术网

Java 将SpringBoot与Neo4J一起使用:更新节点会创建重复的节点

Java 将SpringBoot与Neo4J一起使用:更新节点会创建重复的节点,java,spring-boot,neo4j,spring-data-neo4j-4,Java,Spring Boot,Neo4j,Spring Data Neo4j 4,我正在尝试更新Neo4J上的一个节点,但结果是它创建了一个重复的节点。我读到更新必须在单个事务中进行,我添加了@Transactional,但结果仍然相同。这是我的。我尝试了读取和删除旧节点,并保存新节点的方法,它似乎正在工作。但是,我认为这不是正确的方法。为什么@Transactional注释不起作用。多谢各位 @EnableNeo4JRepositories(com.example.graph.repo) @EnableTransactionManagement @org.springfra

我正在尝试更新Neo4J上的一个节点,但结果是它创建了一个重复的节点。我读到更新必须在单个事务中进行,我添加了@Transactional,但结果仍然相同。这是我的。我尝试了读取和删除旧节点,并保存新节点的方法,它似乎正在工作。但是,我认为这不是正确的方法。为什么@Transactional注释不起作用。多谢各位

@EnableNeo4JRepositories(com.example.graph.repo)
@EnableTransactionManagement
@org.springframework.contect.annotation.Configuration
public class Neo4JConfig {
   @Bean
   public Configuration configuration() {
       Configuration cfg = new Configuration();
       cfg.driverConfiguration()                 
       .setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver")
       .setURI("http://neo4j:neo4j@localhost:7474");
       return cfg;
    }

    @Bean 
    public SessionFactory sessionFactory() {
       return new SessionFactory(configuration(), "com.example");
    }

    @Bean
    public Neo4jTransactionManager transactionManager() {
       return new Neo4JTransactionManager(sessionFactory());
    }
}

@Service
public class UserService{
   @Autowired
   UserRepository userRepository;

   @Transactional
   public void updateUser(User user) {
       User existingUser = userRepository.getExistingUser(user.getUserName());
       if(existingUser != null ) {
           user.setSomeValue(existingUser.getSomeValue());
           userRepository.save(user);
       }
   }
}

SpringAOP默认使用JDK代理机制。这意味着您必须通过接口方法调用
@Transactional
方法

因此,您应该将服务分为接口
UserService
和实现(比如
userserviceinmpl
),将接口自动连接到当前自动连接执行的代码中,然后通过接口调用事务方法


另一种方法是强制Spring使用CGLIB,只要这种机制不限于接口。这两种机制的更多细节

我按照您的建议更新了代码。但是,在保存时,我仍然会得到重复的节点。我添加了UserService接口,并用“Service”对其进行了注释。在控制器中,我自动连接了UserService。我必须向UserServiceImpl添加组件注释。是否还有其他我可能做错的事情。不确定是否相关,但要更新的节点已经有一些关系。谢谢你的帮助。上面的建议确实有效。在上面的代码中,我保存的是用户而不是现有用户。一旦我解决了这个问题,在Nicholay的建议下,它就起作用了。