Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
Spring mvc 事务从未完成Neo4j_Spring Mvc_Neo4j_Spring Data Neo4j_Spring Transactions - Fatal编程技术网

Spring mvc 事务从未完成Neo4j

Spring mvc 事务从未完成Neo4j,spring-mvc,neo4j,spring-data-neo4j,spring-transactions,Spring Mvc,Neo4j,Spring Data Neo4j,Spring Transactions,我有一个方法可以创建一个子图,它是这样定义的: @Transactional public Post createAndLink(Appuser appuser, Post post, String linkTo) { Post savedPost = null; if(post != null && appuser != null){ post.setCreatedBy(appuser); if(post.getId() ==

我有一个方法可以创建一个子图,它是这样定义的:

@Transactional
public Post createAndLink(Appuser appuser, Post post, String linkTo) {

    Post savedPost = null;
    if(post != null && appuser != null){
        post.setCreatedBy(appuser);
        if(post.getId() == null && post.getId() == ""){
            post.setId("IND"+GenerateUUID.getUUID());
        }
        System.out.println(">>> Id created : "+post.getId());

        //Date check
        String d = post.getDate();
        if(d != null && d.length() == 11 && ConversionUtils.isNumeric(d.substring(0, 4))
                && ConversionUtils.isNumeric(d.substring(5, 7)) && ConversionUtils.isNumeric(d.substring(8, 10))){
            if(!ConversionUtils.isPastDate(d)){
                System.out.println("Cannot save post with date after today");
                return null;
            }
        }

        System.out.println(">>> Date created : "+post.getDate());

        //People check
        Set<People> people = new HashSet<People>();
        if(post.getPeople() != null){
            for(People p : post.getPeople()){
                People pFromDb = peopleService.findById(p.getId());
                people.add(pFromDb != null ? pFromDb : new People("PPL"+GenerateUUID.getUUID(), p.getName()));
            }
            post.setPeople(people);
        }
        System.out.println(">>> People created : "+post.getPeople());

        //Place check
        if(post.getPlace() != null){
            Place pFromDb = placeService.findById(post.getPlace().getId());
            post.setPlace(pFromDb != null ? pFromDb : new Place(post.getPlace().getId()));
        }

        System.out.println(">>> Place created : "+post.getPlace());

        System.out.println("Post checking OK.");

        savedPost = repository.findById(linkTo);

        if(savedPost != null){
            Set<Post> linked = new HashSet<Post>();
            linked.add(savedPost);
            post.setLinkedPosts(linked);
        }
        template.save(post);

        System.out.println("=====> [saveWithUser]: Saved OK!");
    }

    return savedPost;
}
PS:在阻塞之前的迭代,它显示正常的日志执行,但在数据库中没有创建任何内容

编辑2

有时我会遇到这个错误(总是在第二次迭代期间,而第1次显示正常日志,但在DB上什么也不写):


我想我找到了问题(但还没有找到解决办法)

我从服务方法中删除了所有@Transactional注释(控制器和存储库未标记为Transactional)

在主帖子中描述的createAndLink方法中,我以这种方式添加了事务:

if(post != null && appuser != null){
    Transaction tx = template.getGraphDatabaseService().beginTx();
    //I kept the same code...
    //...
    tx.success();
    tx.close();

}
现在,当我从控制器a调用这个方法时,tx是安慰剂类型。当我从控制器B调用它时,tx类型是顶级

我甚至做了一个测试,从控制器B调用控制器a方法(如下面的例子),它工作得很好(使用顶级Tx)。当我以相反的方式做时,Tx是安慰剂

控制器A:

@RequestMapping(value="/newandlinksimilar/{linkedTo}", method=RequestMethod.POST)
public @ResponseBody boolean createAndLinkNewSimilar(@RequestBody Post post, @PathVariable String linkedTo){
        Post created = null;
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (post!= null && !(auth instanceof AnonymousAuthenticationToken)) {
            AppuserDetails userDetails = (AppuserDetails)auth.getPrincipal();
            Appuser currentUser = appuserService.findByLogin(userDetails.getUsername());
            created = postService.createAndLinkSimilar(currentUser, post, linkedTo);
        }
       return created;
}
@autowired
private ControllerA controllerA;

@RequestMapping("/init")
public ModelAndView init(){
    //I create a new Post object "post" with dummy data
    controllerA.createAndLinkSimilar(post,"XXXXXX");
    //Or postService.createAndLinkSimilar(appuser,post,"XXXXXX");
    return new ModelAndView("home");
}
控制器B:

@RequestMapping(value="/newandlinksimilar/{linkedTo}", method=RequestMethod.POST)
public @ResponseBody boolean createAndLinkNewSimilar(@RequestBody Post post, @PathVariable String linkedTo){
        Post created = null;
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (post!= null && !(auth instanceof AnonymousAuthenticationToken)) {
            AppuserDetails userDetails = (AppuserDetails)auth.getPrincipal();
            Appuser currentUser = appuserService.findByLogin(userDetails.getUsername());
            created = postService.createAndLinkSimilar(currentUser, post, linkedTo);
        }
       return created;
}
@autowired
private ControllerA controllerA;

@RequestMapping("/init")
public ModelAndView init(){
    //I create a new Post object "post" with dummy data
    controllerA.createAndLinkSimilar(post,"XXXXXX");
    //Or postService.createAndLinkSimilar(appuser,post,"XXXXXX");
    return new ModelAndView("home");
}
这两个测试都是通过对控制器方法的GUI ajax调用进行的


我不明白Spring何时以及如何选择事务类型

它卡住了
意味着什么?例外(什么是stacktrace?)被阻止了?(在事务/数据库日志激活的情况下发布日志)很抱歉,不太清楚。这意味着没有任何进化,也没有例外(好像还在进行中)。请告诉我在哪里可以找到您提到的日志,以及如何激活该选项?大多数情况下,这些日志都可以在IDE的控制台中找到。如果不是,它们可能位于名为something.log的文件中。我不知道如何激活事务的特定日志,因为它取决于您的日志库。(log4j被广泛使用,并带有log4j.properties或log4j.xml来配置它)(对于neo4j:)谢谢。我将在激活日志的情况下进行复制,并将其发布到此处。我无法获得任何可读的日志。I'm lost:/n所有日志(messages.log除外)都已编码