V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
madworks
V2EX  ›  Java

各位大佬, jpa 和 mybatis 一起用符合设计吗,有哪些隐患

  •  
  •   madworks · 2020-10-27 14:10:58 +08:00 · 5993 次点击
    这是一个创建于 1520 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前几天用到一个生成器,vue 前端和后端一键生成,代码超级简洁,完全不用改,只是用的 jpa,但是涉及复杂的数据查询 jpa 肯定很繁琐,就想也用上 mybatis,而且发现 mybatisgenerator 稍微修改下 model 生成器源码,就可以满足 jpamybatis 共用 model 类,就是不知道这样有没有什么不好,想请教下各位童靴有没有和 mybatis 一起混用的,有没有什么隐患,注意的地方,
    40 条回复    2021-05-26 10:16:59 +08:00
    echo1937
        1
    echo1937  
       2020-10-27 14:14:50 +08:00
    我就是这么用的.
    lori01
        2
    lori01  
       2020-10-27 14:16:59 +08:00
    我的博客网站也是这么用的,jpa 真的省掉了很多 sql 编写,复杂的不能用 jpa 的就用 mybaits,很方便,效率非常高
    wysnylc
        3
    wysnylc  
       2020-10-27 14:32:41 +08:00
    Mybatis 用 tkmapper 可以不需要 MybatisGenerator 生成 xml 和 entity 而使用 Example,减少代码污染
    THESDZ
        4
    THESDZ  
       2020-10-27 14:37:03 +08:00
    问题不大,注意的地方就是后续维护,表(实体)改动的时候两个地方都要改
    guoyuchuan
        5
    guoyuchuan  
       2020-10-27 14:39:18 +08:00
    目前我们公司就是 hibernate 和 mybatis 两者结合使用:
    操作数据使用 hibernate ;
    查询使用 mybatis

    问题:
    目前还没遇到问题,估计是我才接触这个项目吧。。。
    madworks
        6
    madworks  
    OP
       2020-10-27 14:40:49 +08:00
    @guoyuchuan 为什么查询用 mybatis,操作用 hibernate ?难道不是反过来用的吗
    wr516516
        7
    wr516516  
       2020-10-27 14:46:11 +08:00
    @madworks 查询用 mybatis 不是方便 sql 优化吗
    guoyuchuan
        8
    guoyuchuan  
       2020-10-27 14:46:39 +08:00
    @madworks #6 这个我也不知道高层的想法。。。我只是个搬砖的。。。
    yiyi11
        9
    yiyi11  
       2020-10-27 18:13:50 +08:00 via Android   ❤️ 2
    隐患就是没有意识到 mybatisplus 可以替代它们。
    madworks
        10
    madworks  
    OP
       2020-10-27 18:15:38 +08:00
    @wysnylc entity 也可以不用写?
    madworks
        11
    madworks  
    OP
       2020-10-27 18:16:21 +08:00
    @THESDZ jpa 和 mybatis 共用一个 model 啊,就是比较头疼 id
    madworks
        12
    madworks  
    OP
       2020-10-27 18:16:40 +08:00
    @yiyi11 是真的吗
    wysnylc
        13
    wysnylc  
       2020-10-27 18:22:32 +08:00
    @madworks #10 不需要,tkmapper 对比 MybatisGenerator 对代码的侵入非常低,配置也非常简单
    qwerthhusn
        14
    qwerthhusn  
       2020-10-27 18:33:40 +08:00   ❤️ 1
    其实最大的问题就是事务了,假如一个比较复杂的业务同时用了 JPA 和 MyBatis,Spring 的 @Transactional 能不能包的住。。
    然后还有 MyBatis-plus,这玩意挺好用的,增删改查,只要不是复杂的表达式啥的,都不用写 xml,直接代码搞定。但是 MyBatis-plus 这种个人开发出来的东西,自己的小项目用用没问题,公司的项目的话感觉还是别用的好
    EminemW
        15
    EminemW  
       2020-10-27 22:31:55 +08:00
    jpa 不也能写 sql 么
    raullf
        16
    raullf  
       2020-10-27 22:43:02 +08:00 via iPhone
    前端后端生成器是啥
    zzl22100048
        17
    zzl22100048  
       2020-10-27 23:24:51 +08:00 via iPhone
    jpa+querydsl 就够了吧,mybatis 太难维护了
    taogen
        18
    taogen  
       2020-10-27 23:29:41 +08:00
    mybatis plus 不香吗
    jdi
        19
    jdi  
       2020-10-28 00:01:29 +08:00 via Android
    mybatisplus = mybatis+jpa 。
    不过我比较好奇生成器是什么(*´∀`)
    Kirsk
        20
    Kirsk  
       2020-10-28 00:43:14 +08:00 via Android
    其实蛮多地方功能相似 少部分用 mybatis 多表确实有些优势 不过 mapper 一套下来 确实没有 jpa 方便 复杂查询封装下 spec 还是看自身业务场景吧
    ourslay
        21
    ourslay  
       2020-10-28 08:45:56 +08:00 via iPhone   ❤️ 1
    Spring Data JDBC 了解下 。
    cheng6563
        22
    cheng6563  
       2020-10-28 08:53:23 +08:00 via Android
    jpql 稍微复杂点的查询组装就恶心。
    直接在 Java 里拼 SQL 也是一坨一坨的。
    只能用 mybatisplus 才能解决生活的样子
    yalin
        23
    yalin  
       2020-10-28 09:02:49 +08:00
    场景需求决定技术
    Blulotus
        24
    Blulotus  
       2020-10-28 09:13:53 +08:00
    分开用没问题,但一个方法里面同时用 jpa 和 mybatis 发现有问题,就弃用 jpa 了。。问题为:业务调用的逻辑大概为 jpa,mybatis,jpa,但打印 sql 执行的顺序为 jpa,jpa,mybatis,反正就不是按业务的逻辑来执行的,不知道啥原因,都换成 myabtis 就不会。
    pengyOne
        25
    pengyOne  
       2020-10-28 09:31:27 +08:00
    用 mybatis-plus 吧,也提供 jpa 的那些简单操作
    Jrue0011
        26
    Jrue0011  
       2020-10-28 10:02:46 +08:00
    21 楼+1,一起用的话可以试试 Spring Data JDBC,官方文档里有一节就是集成 mybatis
    xuanbg
        27
    xuanbg  
       2020-10-28 10:06:52 +08:00
    一起用没啥问题,反正各管各的也不会打架,能有什么问题?
    Jrue0011
        28
    Jrue0011  
       2020-10-28 10:09:02 +08:00
    @Jrue0011 不过 Spring Data JDBC 和 JPA 应该是不一样的,只是功能上和 data jpa 有一定的相似
    aragakiyuii
        29
    aragakiyuii  
       2020-10-28 10:50:31 +08:00 via iPhone
    @Blulotus #24 如果 jpa 不主动 flush 的话,会在整个事务结束末尾一起提交...
    aragakiyuii
        30
    aragakiyuii  
       2020-10-28 10:52:38 +08:00 via iPhone
    @Blulotus #24 这个是 hibernate 的特性,它自己是有一套对于 entity 管理的生命周期,而 mybatis 更倾向于“原生”...
    pkupyx
        31
    pkupyx  
       2020-10-28 10:56:17 +08:00
    之前 mybatis plus 的 generator 生成的 entity 似乎并不是标准 jpa 规范,现在好些了嘛
    gundam0603
        32
    gundam0603  
       2020-10-28 11:08:55 +08:00
    @Blulotus jpa 会重排,里面的顺序是 jpa 管理的,当然管不了 mybatis 的,而且可能不在一个事务,建议是 mybatis 只用来做复杂查询,JPA 更新是什么的,而且不能混用。
    gundam0603
        33
    gundam0603  
       2020-10-28 11:12:33 +08:00
    7,8 年前就这么用了,没大问题,注意别同事务里混着用就行,其实两个现在来讲可能也没那么大差别了。
    anakinsky
        34
    anakinsky  
       2020-10-28 11:26:16 +08:00
    个人倾向于 jpa + querydsl 能解决绝大部分的复杂查询,实在不行用 jdbcTemplate ;代码生成也可以使用 IDEA+groovy 脚本,两种一起不是提升了项目复杂度,一堆 mapper 又是一堆 repository
    Blulotus
        35
    Blulotus  
       2020-10-28 11:27:14 +08:00
    @aragakiyuii 原来是这样,感谢!
    Blulotus
        36
    Blulotus  
       2020-10-28 11:29:26 +08:00
    @gundam0603 明白原因了,感谢解答!
    madworks
        37
    madworks  
    OP
       2020-10-28 11:30:06 +08:00
    @pkupyx entity 类可以自己写个插件生成的,想怎么改怎么改
    madworks
        38
    madworks  
    OP
       2020-10-28 11:40:31 +08:00
    @gundam0603 你是说 jpa 对数据库的操作会重排吗
    gundam0603
        39
    gundam0603  
       2020-10-29 13:12:48 +08:00
    @madworks 记得会在事务提交的时候改变提交的顺序
    redcoffeecat
        40
    redcoffeecat  
       2021-05-26 10:16:59 +08:00
    @qwerthhusn t 腾讯都在用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.