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

spring data jpa 到底好在哪?

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

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

    21 条回复    2016-09-06 11:59:57 +08:00
    li24361
        1
    li24361  
       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   ·   我们的愿景   ·   实用小工具   ·   2340 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:50 · PVG 16:50 · LAX 01:50 · JFK 04:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.