V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
eightqueen
V2EX  ›  Java

spring data jpa 到底好在哪?

  •  1
     
  •   eightqueen · Aug 21, 2016 · 12440 views
    This topic created in 3538 days ago, the information mentioned may be changed or developed.

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

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

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

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



    teemoer
        14
    teemoer  
       Aug 29, 2016
    @eightqueen 带 ID 的 实体 并且不存在于数据库 就是 更新操作 不带的 就是 insert , 人家楼上说的是对的, 你不信自己 先 插入一遍 然后 把 实体又从数据库取出来 id 不为空 你再 试试 和 你取出来 id 设为 null 试试. 好好学,学好了再喷 (纯属引用楼上的话)
    eightqueen
        15
    eightqueen  
    OP
       Aug 29, 2016
    @teemoer 真是无语,写了那么多白写了。我现在的需求是实体不带 id ,但是已经写入到了数据库,那么我去 save ,肯定报错啊。但是用 mybatis 可以灵活地写 sql ,通过“ ON DUPLICATE KEY UPDATE ”来解决。
    teemoer
        16
    teemoer  
       Aug 29, 2016
    就算 没 ID ,难道你没主键? ID 只是一个代号 大家默认的 ID 一般都是主键 不一定非要有 ID . 只要有主键就行 ,
    你别告诉我你 数据库表 没主键,就算没主键 那肯定有外键关联 照样能从父操作子.
    eightqueen
        17
    eightqueen  
    OP
       Aug 29, 2016
    @teemoer save 执行的是 insert ,主键一样肯定会报错的。
    markme
        18
    markme  
       Aug 30, 2016
    很多人都是人云亦云。可控性差是真的,学生党、 demo 党就不要再误导别人了。
    nansmallgong
        19
    nansmallgong  
       Aug 30, 2016
    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  
       Sep 6, 2016
    @eightqueen 你自己 下手写代码了吗? 还是想到什么就说什么? 主键有值的 是 update 自己去写 demo 来测试.
    不管是啥东西 都有好有坏 在你的需求面前 弊大于利益 那就 值得去用. 刀造出来 能 切菜 也能杀人.
    teemoer
        21
    teemoer  
       Sep 6, 2016   ❤️ 1
    帮你写了
    ![]( )
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3310 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 12:12 · PVG 20:12 · LAX 05:12 · JFK 08:12
    ♥ Do have faith in what you're doing.