spring data jpa 到底好在哪?

2016-08-21 17:39:47 +08:00
 eightqueen

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

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

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

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



teemoer
2016-08-29 14:08:52 +08:00
@eightqueen 带 ID 的 实体 并且不存在于数据库 就是 更新操作 不带的 就是 insert , 人家楼上说的是对的, 你不信自己 先 插入一遍 然后 把 实体又从数据库取出来 id 不为空 你再 试试 和 你取出来 id 设为 null 试试. 好好学,学好了再喷 (纯属引用楼上的话)
eightqueen
2016-08-29 15:20:05 +08:00
@teemoer 真是无语,写了那么多白写了。我现在的需求是实体不带 id ,但是已经写入到了数据库,那么我去 save ,肯定报错啊。但是用 mybatis 可以灵活地写 sql ,通过“ ON DUPLICATE KEY UPDATE ”来解决。
teemoer
2016-08-29 18:43:28 +08:00
就算 没 ID ,难道你没主键? ID 只是一个代号 大家默认的 ID 一般都是主键 不一定非要有 ID . 只要有主键就行 ,
你别告诉我你 数据库表 没主键,就算没主键 那肯定有外键关联 照样能从父操作子.
eightqueen
2016-08-29 22:02:14 +08:00
@teemoer save 执行的是 insert ,主键一样肯定会报错的。
markme
2016-08-30 09:23:05 +08:00
很多人都是人云亦云。可控性差是真的,学生党、 demo 党就不要再误导别人了。
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
2016-09-06 11:32:13 +08:00
@eightqueen 你自己 下手写代码了吗? 还是想到什么就说什么? 主键有值的 是 update 自己去写 demo 来测试.
不管是啥东西 都有好有坏 在你的需求面前 弊大于利益 那就 值得去用. 刀造出来 能 切菜 也能杀人.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/300781

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX