使用mybatis-plus遇到循环依赖,与不能插入id为null问题

Q1:在用mybatis-plus发现问题,我两个service这里就用A,B代替,这两个都继承IService,然后都有各自实现类,最后在同一个Controller中引用,会出现循环依赖吗?
关系如图

img

Q2:还有为什么在实体类中指定了id为雪花算法,然后在手写xml中写sql时却说id不能插入为null,这是因为雪花算法只能提供给其自带方法使用吗?要在手写xml中使用,如何使用呢

如果A和B都继承自IService,并且它们各自有不同的实现类,那么在同一个Controller中引用A和B不会出现循环依赖问题。
循环依赖问题通常发生在两个或多个组件相互依赖的情况下。如果服务A依赖B,而服务B又依赖A,那么就会产生循环依赖问题,编译都通不过的
如果你的情况是A和B分别有自己独立的实现类,那么它们之间是不存在直接依赖关系的,因此不会出现循环依赖问题。不过,如果A的实现类依赖了B的实现类,或者B的实现类依赖了A的实现类,那么就有可能出现循环依赖问题,需要注意。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于第一个问题,如果A和B都依赖于对方,就会出现循环依赖的问题。解决方法有多种,一种是使用构造器注入代替属性注入,另一种是将其中一个Service改为使用接口而非实现类注入。具体的解决方案可以参考Spring官方文档中解决循环依赖的章节。

    对于第二个问题,是因为手写xml插入时没有为ID赋值,导致提示ID为null。解决方法是在手写的xml语句中指明要赋值的id字段,并在代码中生成对应的id赋给这个字段。由于使用了雪花算法,可以使用Java代码中的Snowflake ID生成器自动生成唯一ID。代码示例:

    // 定义一个全局的Snowflake ID生成器
    private static Snowflake snowflake = IdUtil.createSnowflake(0, 0);
    
    // 在插入实体数据前生成ID并为实体赋值
    long id = snowflake.nextId(); // 生成唯一ID
    TopiceBean topiceBean = new TopiceBean();
    topiceBean.setId(id); // 赋值给实体中的ID字段
    

    然后就可以在手写的xml语句中插入这个ID了:

    <insert id="addTopice" parameterType="com.example.TopiceBean">
      insert into tb_topic (id, title, author, content, submittime, forumid)
      values(#{id}, #{title}, #{author}, #{content}, #{submittime}, (select max(id) from tb_forum))
    </insert>
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^