首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合使用SpringBoot和Neo4J:更新节点会创建重复的节点

结合使用SpringBoot和Neo4J:更新节点会创建重复的节点
EN

Stack Overflow用户
提问于 2018-01-16 12:22:28
回答 1查看 226关注 0票数 0

我正在尝试更新Neo4J上的一个节点,但最终发生的是它创建了一个重复的节点。我读到更新必须在单个事务中,我添加了@ transaction,但结果仍然是一样的。这是我所拥有的。我尝试了读取并删除旧节点,然后保存新节点的方法,它似乎正在工作。但是,我认为这不是正确的方法。为什么@Transactional注解不起作用。谢谢。

代码语言:javascript
复制
@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);
       }
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 13:40:21

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48274062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档