前几天看网上几篇博客介绍 jpa ,感觉挺好用的,今天学习了一下,功能好弱啊。 save 原来是插入,更新 api 没有, ON DUPLICATE KEY UPDATE (避免重复插入)功能也没有,这些都是很基础的啊。
1
li24361 2016-08-21 18:31:22 +08:00
jpa 能极大的简化被人诟病的增删改查,不是很多人说 java 后台就是增删改查的大合集么,这个解放了生产力,可以让人有更多的时间去思考别的东西,而且只要按照标准声明,就可以创建基础的查询方法,还可以自己定制语句,基本满足需求了,避免重复插入,可以通过数据库定义和注解自定义语句实现吧
这都是我个人看法,公司的确应用 jpa 的比较少,我们还是用的 mybatis |
2
ewBuyVmLZMZE 2016-08-21 19:15:47 +08:00
首先,你需要去补习 JPA 吧。
|
3
qiyuey 2016-08-21 19:42:25 +08:00
当初用 hibernate 的时候我也是只用 hql ,想想 spring data jpa ,我也感觉可控性太差了
|
4
guodong110 2016-08-22 04:34:31 +08:00 via Android
怎么可能没更新 还是好好学下吧 没学多少就喷
|
5
eightqueen OP @guodong110 看来你也不会
|
6
domty 2016-08-22 11:57:35 +08:00
save 方法我记得是插入更新合一的。
问题在于没有办法设置空值不插入。 所以每次更新都得先根据主键 get 到这个对象,然后合并更新后的数据再 save 。 jpa 针对某些业务的确减少了代码量,但是多表连接方面的处理是不怎么让人舒服, 也可能是我用 mybatis 比较多,更习惯 mybatis+generator |
7
guodong110 2016-08-22 13:02:03 +08:00
@eightqueen saveAndFlush 不是吗 算我没学过吧
|
8
guodong110 2016-08-22 13:21:08 +08:00
@eightqueen 确实会如 @domty 所说的不能设置空值不插入
|
9
afpro 2016-08-22 13:49:52 +08:00
jpa 有时候会出现十分诡异而且不知所谓的错误 尤其是 transaction 这一块 还是老老实实 mybatis 吧
|
10
eightqueen OP @guodong110 @domty 每次 save 一个对象,不知道 id 的话,我就得先查询一次
|
11
timi 2016-08-23 09:25:24 +08:00
jpa 也可以写 nativeQuery 啊。。。
|
12
leaves615 2016-08-24 23:49:11 +08:00
|
13
teemoer 2016-08-29 13:58:25 +08:00
噢 ? 是吗
当 java8 遇上 S JPA 你可以这样写任何需求的 sql |
14
teemoer 2016-08-29 14:08:52 +08:00
@eightqueen 带 ID 的 实体 并且不存在于数据库 就是 更新操作 不带的 就是 insert , 人家楼上说的是对的, 你不信自己 先 插入一遍 然后 把 实体又从数据库取出来 id 不为空 你再 试试 和 你取出来 id 设为 null 试试. 好好学,学好了再喷 (纯属引用楼上的话)
|
15
eightqueen OP @teemoer 真是无语,写了那么多白写了。我现在的需求是实体不带 id ,但是已经写入到了数据库,那么我去 save ,肯定报错啊。但是用 mybatis 可以灵活地写 sql ,通过“ ON DUPLICATE KEY UPDATE ”来解决。
|
16
teemoer 2016-08-29 18:43:28 +08:00
就算 没 ID ,难道你没主键? ID 只是一个代号 大家默认的 ID 一般都是主键 不一定非要有 ID . 只要有主键就行 ,
你别告诉我你 数据库表 没主键,就算没主键 那肯定有外键关联 照样能从父操作子. |
17
eightqueen OP @teemoer save 执行的是 insert ,主键一样肯定会报错的。
|
18
markme 2016-08-30 09:23:05 +08:00
很多人都是人云亦云。可控性差是真的,学生党、 demo 党就不要再误导别人了。
|
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) 以上。。 |
20
teemoer 2016-09-06 11:32:13 +08:00
@eightqueen 你自己 下手写代码了吗? 还是想到什么就说什么? 主键有值的 是 update 自己去写 demo 来测试.
不管是啥东西 都有好有坏 在你的需求面前 弊大于利益 那就 值得去用. 刀造出来 能 切菜 也能杀人. |
21
teemoer 2016-09-06 11:59:57 +08:00 1
帮你写了
![]( ) |