mybatis orm 表继承思考

来源:互联网 发布:ubuntu 复制文字 编辑:程序博客网 时间:2024/06/07 22:23

现在有个需求 原来有个class1 对应table1

现在有个新需求 有很多新的class1的子类 class2 class3等等 (准确的说应该是新需求也是在table1插入了一条数据,只不过有自己字段)

这时候领导搞了一个表 记录这些class2 class3各自的信息 当然有些字段是空的 因为每一种都不一样

格局面向对象的思想 class2 class3是我搞出来的 继承了class1,

然后表没法继承 (pg可以)

所以我想了几种方案

1 mybatis resultmap继承一下 前提是创建了2个表 但是这样需要自己写关联查询 

因为我们要开发好几个数据库版本啊 坑啊 oracle db2 mysql啊 所以写sql 太麻烦

2 mybaits resultmap 加入discriminator只适合一个表的情况 即所有子表的数据冗余到父表中 但是领导搞了2个表

3 在dao中查询

我这里的dao 不是mybatis的mapper文件 上面说了 因为我们有很多数据库版本 所以mybatis自动生成的我不做修改

在service和mapper文件之间在搞了一个dao

然后在dao中查询 父表和子表的然后拼装,这种情况我希望返回的时候是一个子类的对象 、当然第1种方案是更好的orm,

因为mybatis返回回来的已经是子类,但是这种方案返回的是父类和一个只有子类信息的类 还需要自己实例化子类 自己拼装

坑的是我刚来的时候没有三层架构 只有一层 然后选择有了2层 (mapper文件不修改 相当于没有)

我现在自己搞了第三层 不然service层很多重复的代码 以及service嵌套service(因为dao层的东西放到service 原来应该service注入dao现在要注入service了)

最坑的是写的不亦乐乎


在数据库表中实现表继承一般来说有3种实现方式: Concrete Table Inheritance(具体表继承) Single Table Inheritance(单表继承) Class Table Inheritance(类表继承)。

比如有一只鸭子,它有属性是:动物,会叫,两只脚。来了一只可达鸭(除了鸭的属性,还有会唱可达歌),又来了一只大黄鸭(除了鸭的属性,会跳大黄鸭之舞),它们各有各自的属性。

  1.具体表继承

  具体表现:不建立父对象,将父对象的所有属性转移到子对象中,为每个子对象建立对于的表。建可达鸭表和大黄鸭表。

 

  2.单表继承

  具体表现:在一个宽表中列出所有父对象和子对象的属性,同时用一个标识列表示该行数据存储的是哪个子类的数据。多一个type字段,用来指明是什么鸭。

 

  3.类继承表

  具体表现:对父对象和每个子对象建立一个对应的表,然后在子表中设置该子表的主键为与父表关联的外键。给他们新增一个字段,鸭的id。这个id,在两张字表中,即表示主键,又表示外键。

 




原创粉丝点击