spring data jpa 到底好在哪? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eightqueen
V2EX    Java

spring data jpa 到底好在哪?

  •  1
     
  •   eightqueen 2016-08-21 17:39:47 +08:00 12053 次点击
    这是一个创建于 3347 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天看网上几篇博客介绍 jpa ,感觉挺好用的,今天学习了一下,功能好弱啊。 save 原来是插入,更新 api 没有, ON DUPLICATE KEY UPDATE (避免重复插入)功能也没有,这些都是很基础的啊。

    21 条回复    2016-09-06 11:59:57 +08:00
    north521
        1
    north521  
       2016-08-21 18:31:22 +08:00
    jpa 能极大的简化被人诟病的增删改查,不是很多人说 java 后台就是增删改查的大合集么,这个解放了生产力,可以让人有更多的时间去思考别的东西,而且只要按照标准声明,就可以创建基础的查询方法,还可以自己定制语句,基本满足需求了,避免重复插入,可以通过数据库定义和注解自定义语句实现吧
    这都是我个人看法,公司的确应用 jpa 的比较少,我们还是用的 mybatis
    ewBuyVmLZMZE
        2
    ewBuyVmLZMZE  
       2016-08-21 19:15:47 +08:00
    首先,你需要去补习 JPA 吧。
    qiyuey
        3
    qiyuey  
       2016-08-21 19:42:25 +08:00
    当初用 hibernate 的时候我也是只用 hql ,想想 spring data jpa ,我也感觉可控性太差了
    guodong110
        4
    guodong110  
       2016-08-22 04:34:31 +08:00 via Android
    怎么可能没更新 还是好好学下吧 没学多少就喷
    eightqueen
        5
    eightqueen  
    OP
       2016-08-22 10:11:14 +08:00
    @guodong110 看来你也不会
    domty
        6
    domty  
       2016-08-22 11:57:35 +08:00
    save 方法我记得是插入更新合一的。
    问题在于没有办法设置空值不插入。
    所以每次更新都得先根据主键 get 到这个对象,然后合并更新后的数据再 save 。

    jpa 针对某些业务的确减少了代码量,但是多表连接方面的处理是不怎么让人舒服,
    也可能是我用 mybatis 比较多,更习惯 mybatis+generator
    guodong110
        7
    guodong110  
       2016-08-22 13:02:03 +08:00
    @eightqueen saveAndFlush 不是吗 算我没学过吧
    guodong110
        8
    guodong110  
       2016-08-22 13:21:08 +08:00
    @eightqueen 确实会如 @domty 所说的不能设置空值不插入
    afpro
        9
    afpro  
       2016-08-22 13:49:52 +08:00
    jpa 有时候会出现十分诡异而且不知所谓的错误 尤其是 transaction 这一块 还是老老实实 mybatis 吧
    eightqueen
        10
    eightqueen  
    OP
       2016-08-22 14:04:40 +08:00
    @guodong110 @domty 每次 save 一个对象,不知道 id 的话,我就得先查询一次
    timi
        11
    timi  
       2016-08-23 09:25:24 +08:00
    jpa 也可以写 nativeQuery 啊。。。
    leaves615
        12
    leaves615  
       2016-08-24 23:49:11 +08:00
    @li24361 @domty 很多人做 java 系统的都还是在面向数据库编程,而没有真正地面向对象(业务)编程。现在的复杂点点的系统,随便一个业务逻辑,就可能引出 N 张表关联,面向数据库表结构编程是做死人的节奏,虽然辛苦实现逻辑,但是维护 /接手的童鞋是欲哭无泪啊。再加上存储过程,都想跳楼了。
    如果业务层把相关逻辑都处理好了,到数据持久化时,就只剩下 CUD 等基本操作了。 这就没什么复杂的数据持久化操作
    spring-data-jpa 默认使用的是 hibernate-jpa 实现, 我觉得大大简化了持久化相关代码复杂度,及代码量。 单表操作时,只需要定义接口方法,都不再需要实现类。
    teemoer
        13
    teemoer  
       2016-08-29 13:58:25 +08:00
    噢 ? 是吗

    当 java8 遇上 S JPA 你可以这样写任何需求的 sql



    teemoer
        14
    teemoer  
       2016-08-29 14:08:52 +08:00
    @eightqueen 带 ID 的 实体 并且不存在于数据库 就是 更新操作 不带的 就是 insert , 人家楼上说的是对的, 你不信自己 先 插入一遍 然后 把 实体又从数据库取出来 id 不为空 你再 试试 和 你取出来 id 设为 null 试试. 好好学,学好了再喷 (纯属引用楼上的话)
    eightqueen
        15
    eightqueen  
    OP
       2016-08-29 15:20:05 +08:00
    @teemoer 真是无语,写了那么多白写了。我现在的需求是实体不带 id ,但是已经写入到了数据库,那么我去 save ,肯定报错啊。但是用 mybatis 可以灵活地写 sql ,通过“ ON DUPLICATE KEY UPDATE ”来解决。
    teemoer
        16
    teemoer  
       2016-08-29 18:43:28 +08:00
    就算 没 ID ,难道你没主键? ID 只是一个代号 大家默认的 ID 一般都是主键 不一定非要有 ID . 只要有主键就行 ,
    你别告诉我你 数据库表 没主键,就算没主键 那肯定有外键关联 照样能从父操作子.
    eightqueen
        17
    eightqueen  
    OP
       2016-08-29 22:02:14 +08:00
    @teemoer save 执行的是 insert ,主键一样肯定会报错的。
    markme
        18
    markme  
       2016-08-30 09:23:05 +08:00
    很多人都是人云亦云。可控性差是真的,学生党、 demo 党就不要再误导别人了。
    nansmallgong
        19
    nansmallgong  
       2016-08-30 13:38:07 +08:00
    1.service 层用 @Transactional ,从 repository 读取的 entity 处于跟踪态,当方法结束, entity 的变更自动同步到数据库,不需要再调用 save 方法
    2.save 方法本身会根据 id 来判断是执行 insert 或者 update
    3.“操控性差,不能写 sql , hql ” : repository 层,使用 @Query 注解,@Query("这里写 hql"), @Query("这里写 sql",native=true)

    以上。。
    teemoer
        20
    teemoer  
       2016-09-06 11:32:13 +08:00
    @eightqueen 你自己 下手写代码了吗? 还是想到什么就说什么? 主键有值的 是 update 自己去写 demo 来测试.
    不管是啥东西 都有好有坏 在你的需求面前 弊大于利益 那就 值得去用. 刀造出来 能 切菜 也能杀人.
    teemoer
        21
    teemoer  
       2016-09-06 11:59:57 +08:00   1
    帮你写了
    ![]( )
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1023 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:41 PVG 06:41 LAX 15:41 JFK 18:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86