请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师想问下,就是我不管弄的是oracle数据库配置,还是mysql数据库配置,jpa还是那一套接口方法,它是怎么知道的

老师想问下,就是我不管弄的是oracle数据库配置,还是mysql数据库配置,jpa还是那一套接口方法,它是怎么知道的,如何动态取实现的呢,谢谢;

那老师,比如我想实现多个 Repository,然后又jpa的,有es的,有mongo的,只要配置做一下切换,想使用哪个就哪个可以做到嘛,前提是表名称都一样,字段也一样,这种需求就是有的客户想用mongo,有的想用es,有的想用Mysql之类的

正在回答

1回答

同学你好:

    其实,你可以注意到,我们在写 JPA 的 ORM 时,写的是接口而不是实现类;所以,JPA 在实现时实际上是动态代理,给你的 jpa 接口生成代理对象;所以,当你定义了 MySQL 驱动,则给你生成 MySQL 相关的查询逻辑;你定义了 Oracle 驱动,就给你生成 Orcale 相关的查询逻辑。

2 回复 有任何疑惑可以回复我~
  • 提问者 奶茶三兄弟d #1
    不好意思啊,老师,我还想问一下就是,比如我有一个专门做聚合查询的服务,然后呢其实本来是用es 实现的,假设以后换上了mongodb,我原来的实现都不想改,只需要配置哪个类型的数据源,可以自动找到对应的实现, 我是不是也参考上面那种代理的方式! 但是有个问题,Jpa、Mongo、es 的Repository,他要给的域类形式不一样,比如jpa的传递的类,你要加上@Entity,其他要加上@Document,那问题就是比如es、mongo、mysql 都定义了一个同样的表叫User,为了方便后面想切换数据源了,那要对它进行一些聚合查询操作,那service 那层该如何封装呢,因为就算动态代理了,找到了具体的服务去查询了,但是返回的User,我咋接受呢,因为下层有三个类型的User!这点没想通,谢谢老师
    回复 有任何疑惑可以回复我~ 2021-07-09 11:10:34
  • 张勤一 回复 提问者 奶茶三兄弟d #2
    最简单的方式是根据每一种实现编写类似的代码,自己写动态代理,不太现实
    回复 有任何疑惑可以回复我~ 2021-07-09 12:26:54
  • 提问者 奶茶三兄弟d #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-07-09 17:24:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信