nebula-contrib / ngbatis

NGBATIS is a database ORM framework base NebulaGraph + spring-boot, which takes advantage of the mybatis’ fashion development, including some de-factor operations in single table and vertex-edge, like mybatis-plus. NGBATIS 是一款针对 NebulaGraph + Springboot 的数据库 ORM 框架。借鉴于 MyBatis 的使用习惯进行开发。https://graph-cn.github.io/ngbatis-docs/
https://nebula-contrib.github.io/ngbatis/
Apache License 2.0
132 stars 42 forks source link

同名不同包的Mapper/dao无法注册 #194

Closed xingsheq closed 1 year ago

xingsheq commented 1 year ago

项目中不同space的Vertex定义是一样的,如果才能实现复用? 我现在是通过java类复制到不同包下面,mapper.xml在mapper/子目录下面,但dao/mapper不能注册成功 The bean 'ServerVertexMapper$Proxy' could not be registered. A bean with that name has already been defined and overriding is disabled.

xingsheq commented 1 year ago

已验证,dao的java类名不能相同,即时在不同包也不行,请自行决定是否优化。

CorvusYe commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

CorvusYe commented 1 year ago

看了下现在发布了的版本,同名不同包也是支持的 只是用法会有一些奇怪,需要再改改:

@Component("OtherServerVertexMapper")
public class ServerVertextMapper {}
@Resource("OtherServerVertexMapper$Proxy") ServerVertextMapper mapper;

现在可以这么用,奇怪的点是使用的时候多了一个 $Proxy 下个版本会把后面的 $Proxy 去掉,来保证声明跟使用的一致

xingsheq commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

今天发现如果mapper.xml同名,vertex同名,但在不同包,selectById有几率查出来vertex的类型会混乱,报不能cast,请看看是否有这个bug。

CorvusYe commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

今天发现如果mapper.xml同名,vertex同名,但在不同包,selectById有几率查出来vertex的类型会混乱,报不能cast,请看看是否有这个bug。

tag类型是不一样的吧?NebulaDaoBasic的泛型是否也对应不同包名?

xingsheq commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

今天发现如果mapper.xml同名,vertex同名,但在不同包,selectById有几率查出来vertex的类型会混乱,报不能cast,请看看是否有这个bug。

tag类型是不一样的吧?NebulaDaoBasic的泛型是否也对应不同包名?

tag是一样的,dao里面的vertex泛型是不同包的。泛型里面指定了space

@Data @Table(name = "host") @Space(name = "xx") public class HostVertex {

@Id
String name;
String neType;

}

xingsheq commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

今天发现如果mapper.xml同名,vertex同名,但在不同包,selectById有几率查出来vertex的类型会混乱,报不能cast,请看看是否有这个bug。

tag类型是不一样的吧?NebulaDaoBasic的泛型是否也对应不同包名?

改了vertex的名字也是不行的,异常如下:

StackTrace=java.lang.ClassCastException: class com.xx.bj.model.vertex.BJHostVertex cannot be cast to class com.xx.dd.model.vertex.HostVertex (com.xx.bj.model.vertex.BJHostVertex and com.xx.dd.model.vertex.HostVertex are in unnamed module of loader 'app')

xingsheq commented 1 year ago

如果有同名不同包的类还是需要兼容的,这个我今天处理一下

今天发现如果mapper.xml同名,vertex同名,但在不同包,selectById有几率查出来vertex的类型会混乱,报不能cast,请看看是否有这个bug。

tag类型是不一样的吧?NebulaDaoBasic的泛型是否也对应不同包名?

改了vertex的名字也是不行的,异常如下:

StackTrace=java.lang.ClassCastException: class com.xx.bj.model.vertex.BJHostVertex cannot be cast to class com.xx.dd.model.vertex.HostVertex (com.xx.bj.model.vertex.BJHostVertex and com.xx.dd.model.vertex.HostVertex are in unnamed module of loader 'app')

实际上我用的是下面这个dao查的: public interface HostVertexMapper extends NebulaDaoBasic<HostVertex, String>

补充说明:BJHostVertex和HostVertex的的mapper.xml名字都是HostVertexMapper.xml,但BJHostVertex的HostVertexMapper.xml在mapper目录的子目录bj下面。HostVertex的HostVertexMapper.xml在mapper目录下。

使用的ngbatis版本是1.1.5

CorvusYe commented 1 year ago

如果是相同tag不同space,确实存在映射不上的问题

CorvusYe commented 1 year ago

按我理解,现在的文件结构如下:

是这个意思吗?

xingsheq commented 1 year ago

按我理解,现在的文件结构如下:

  • src

    • java

    • com.xx.bj.model

      • vertex

      • BJHostVertex (tag: host, space: xx1)

      • mapper

      • BJHostVertexMapper (NebulaDaoBasic<BJHostVertex, String>)

    • com.xx.dd.model

      • vertex

      • HostVertex (tag: host, space: xx2)

      • mapper

      • HostVertexMapper (NebulaDaoBasic<HostVertex, String>)

    • resources

    • mapper

      • bj

      • BJHostVertexMapper.xml (namespace: com.xx.bj.model.mapper.BJHostVertexMapper)

      • HostVertexMapper.xml (namespace: com.xx.dd.model.mapper.HostVertexMapper)

是这个意思吗?

mapper和model是同一层的,其他结构没有问题。

xingsheq commented 1 year ago

如果是相同tag不同space,确实存在映射不上的问题

有没有其他可以复用相同tag的vertex的,我看样例里面,mapper.xml里面可以指定space,那是不是我在vertex里面不使用@space,定义2个mapper.xml,配置2个不同space 就可以了吗?

CorvusYe commented 1 year ago

ngbatis有个设计得不好的地方,同名tag在不同的space里,目前的版本只能映射到一个实体类,有同名时会冲突,可以先用不同 space 不同 tag名来处理,这个问题会在后续的版本修复

CorvusYe commented 1 year ago

如果是相同tag不同space,确实存在映射不上的问题

有没有其他可以复用相同tag的vertex的,我看样例里面,mapper.xml里面可以指定space,那是不是我在vertex里面不使用@space,定义2个mapper.xml,配置2个不同space 就可以了吗?

在保持一个实体类跟标签名存在映射的情况下,确实可以定义多个Mapper继承NebulaDaoBasic<T, I>,两个Mapper,T相同,然后通过 xml 指定space,这个方案可以试试,好思路

不过可能存在的风险是,需要严格保持两个 space 下,同名 tag 的字段列表一致