java - 将 Spring Boot 与 Neo4J 结合使用 : Updating node creates duplicate node

标签 java spring-boot neo4j spring-data-neo4j-4

我正在尝试更新 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);
       }
   }
}

最佳答案

Spring AOP默认使用JDK Proxy机制。这意味着您必须通过接口(interface)方法调用@Transactional方法。

因此,您应该将服务分为接口(interface) UserService 和实现(例如 UserServiceImpl ),将接口(interface) Autowiring 到当前 Autowiring 实现的代码中,然后调用事务性通过接口(interface)的方法。

附注另一种方法是强制 Spring 使用 CGLIB,只要该机制不限于接口(interface)。有关两种机制的更多详细信息 https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html

关于java - 将 Spring Boot 与 Neo4J 结合使用 : Updating node creates duplicate node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48274062/

相关文章:

java - Neo4j Traverser - 只需获取特定类型的项目

java - 使用来自 URI 的参数进行 PostMapping

java - 在 Java Spring Boot 中将 CSV 转换为 JSON 数组

java - 如何使用 POJO 处理来自 kafka lister 的事件?

java - 应用程序之间如何交换信号?

neo4j - 如何解释 Cypher 的 LOAD CSV 子句的性能?

neo4j - 社交网络中通知的数据模型?

java - 通过示例在 MongoRepository 查询中包含 Null 检查

java - 获取字符串中某个位置周围的单词

java - 以下代码中的错误接近抛出 IOException