LazyInitializationException with graphql-spring

前端 未结 6 1410
庸人自扰
庸人自扰 2020-12-31 04:21

I am currently in the middle of migrating my REST-Server to GraphQL (at least partly). Most of the work is done, but i stumbled upon this problem which i seem to be unable t

6条回答
  •  余生分开走
    2020-12-31 05:00

    For anyone confused about the accepted answer then you need to change the java entities to include a bidirectional relationship and ensure you use the helper methods to add a Competition otherwise its easy to forget to set the relationship up correctly.

    @Entity
    class Show {
       private Long id;
       private String name;
    
       @OneToMany(cascade = CascadeType.ALL, mappedBy = "show")
       private List competition;
    
       public void addCompetition(Competition c) {
          c.setShow(this);
          competition.add(c);
       }
    }
    
    @Entity
    class Competition {
       private Long id;
       private String name;
    
       @ManyToOne(fetch = FetchType.LAZY)
       private Show show;
    }
    

    The general intuition behind the accepted answer is:

    The graphql resolver ShowResolver will open a transaction to get the list of shows but then it will close the transaction once its done doing that.

    Then the nested graphql query for competitions will attempt to call getCompetition() on each Show instance retrieved from the previous query which will throw a LazyInitializationException because the transaction has been closed.

    {
      shows {
        id
        name
        competitions {
          id
        }
      }
    }
    

    The accepted answer is essentially bypassing retrieving the list of competitions through the OneToMany relationship and instead creates a new query in a new transaction which eliminates the problem.

    Not sure if this is a hack but @Transactional on resolvers doesn't work for me although the logic of doing that does make some sense but I am clearly not understanding the root cause.

提交回复
热议问题