我真的不想再用 JPA 了
在开发者的圈子里,没当说到一种技术好或者不好,都会引发激烈或者不激烈的争论,直到一个开发者出来说 PHP 是世界上最好的语言,大家伙儿才会纷纷退去继续写代码。
今天说 JPA 的问题不是想引发什么讨论或者骂战,单纯的就是我不喜欢 JPA 。没错,就是这么 Real。
说到 Java 开发,涉及到数据库访问的,主要就两种框架,一个是 MyBatis ,另一个就是 JPA。据说是国外 JPA 用的比较多,国内 MyBatis 用的比较多。国内为什么 MyBatis 用的多呢,传说是因为整个阿里系都用它。
JPA 全称是Java 持久化 API ,它的目的就是帮助我们提高开发效率,它的核心是 Java持久化查询语言 (JPQL),对存储在关系数据库中的实体进行查询。在语法上类似于SQL查询,但是操作的是实体对象而不是直接对数据库表进行操作。(摘自 wiki)
使用 JPA 开发的流程如下:
1、将数据库表映射到项目实体中
2、生成对应的 Repository
3、实现 Service ,Service 中调用 Repository
JPA 帮你省事儿的地方就在 Repository 里,对于那些比较简单的逻辑,比如单表查询,直接根据名字就可以实现查询逻辑。对于大部分查询来说,真的很省事儿。但刚开始用的时候,确实感觉有些莫名其妙。
确实如此,如果你用过 JPA ,有些时候它确实对开发效率有很大提升,JPA 想要做的就是尽量让你少写 sql,甚至不写 sql。基于这种思想,JPA 实现了它自己的一套语法、注解规则。
JPA 要用各种注解配合来实现数据实体间的一对多、多对多等等的关联关系。正因为这样,我觉得实体变得不单纯是实体,而是掺杂的逻辑在里面,也增加了实体的复杂度,对于比较复杂的业务来说,很容易造成实体间直接或间接的循环引用。
你如果想用 JPA,除了要掌握各种注解外,对于稍微复杂的查询,还要掌握它的那套写法,比如下面这种代码:
Specification<CmContent> specification = (root, criteriaQuery, criteriaBuilder) -> {
Predicate p = criteriaBuilder.equal(root.get("deleted").as(Boolean.class), false);
Predicate news = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_NEWS.name());
Predicate salon = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_SALON.name());
Predicate type = criteriaBuilder.or(news, salon);
...
而且你想要实现一个 join 查询也是够费劲的,除了要写上面那套代码外,还要在实体上做手脚,想到就想哭,有没有。难道直接写个 sql 不好吗,为什么要这么糟蹋自己。
还有一点,JPA 有些注解用上了之后会影响到数据库层面,比方说关键外键的注解,如果你用默认设置,这个外键就真的会应用到数据库表里,在表上建外键。还有其他的一些 ORM 框架也是如此,这是我完全不能接受的,凭什么,凭什么在我的数据库上改东西。
愿我参与的项目中没有 JPA。公司有个项目用到了 JPA ,我也参与了一部分,写的代码不算多,除了令我头疼之外,没有体会到 JPA 的半点好处,这其中当然很可能是由于我的水平有限,或者说我写的 JPA 代码不够多,或者我根本没有领会到 JPA 的精髓所在。总之不管怎么样,对不起,愿我不会再碰到 JPA。
当然这么说肯定是有失偏颇,有些同学可能会对此嗤之以鼻。没错,有同事就是这样说的:事物存在即合理,JPA 这么多年了,如果不好用怎么会还有这么多人用,而且国外 JPA 使用者众多,难道人家都有问题。
如果只是简单的项目,业务一点也不复杂,不复杂到连个 join 都没有的项目,可以用 JPA ,其他的情况下,真的不用它最好。用 JPA 的感觉就像是被绑上了手脚,失去了自由。不自由,毋宁死。纵使千般好,少了自由,我就拒绝它。而 MyBatis 恰恰就是给开发者自由的一个框架。
还是那句话,不自由,毋宁死。这是第一个,恐怕也是最后一个用 JPA 的项目了。
不要吝惜你的「推荐」呦
欢迎关注,不定期更新本系列和其他文章
古时的风筝 ,进入公众号可以加入交流群

我真的不想再用 JPA 了的更多相关文章
- 【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?
写在前面 最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者朋友面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒 ...
- python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)
day13 --------------------------------------------------------------- 实例021:猴子偷桃 题目 猴子吃桃问题:猴子第一天摘下若干 ...
- 不想再做"鸟蛋"
至今为止学习C++两个学期了,有过迷茫,有过自信,有过崩溃,有过希望,有过伤心,有过高兴.这一路走来,C++虐我千百遍,我待C++如"初恋". ...
- 数据库已有时间索引,想再添加ID索引
将时间索引的代码复制进去后,将编辑框的变量改为m_QueryID. 准备先以时间索引查找出大概数据,再直接使用ID索引精确查找. 于是想直接精确查ID为105的数据信息. 出现错误: 发现错误原因是忘 ...
- 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...
- 【Python3练习题 016】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
这题得倒着推.第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第9天还没吃之前有桃子p个,可得:p * 1/2 - 1 = 1,可得 p = 4.以此类推,即可手算出. 代码思路为: ...
- 【Spring】只想用一篇文章记录@Value的使用,不想再找其它了(附思维导图)
1 简介 不得不说,Spring为大家提供许多开箱即用的功能,@Value就是一个极其常用的功能,它能将配置信息注入到bean中去.即使是一个简单的功能,Spring也提供了丰富的注入类型和形式.我经 ...
- java 关于 重写、覆写、覆盖、重载 的总结【不想再傻傻分不清了】
1.前言 有些东西,名称不同,其实就是一个东西,你说是扯淡不? 2.重写 重写,又叫覆写.覆盖 ,注解@Override,词义为推翻 , 用法特点是继承父类后,重写的父类方法名字.参数.返回值必须相同 ...
- 【木德木作杯楼市达人秀NO.28】南湖买房故事
应得意版主的邀请,我也来写写我的买房故事,虽然过程没有别人那么惊心动魄,但是毕竟是自己人生中非常重要的一件事情,就像恋爱一样,情话永远没有情书好,我也借此纪念一下这段短暂的时光.其中会涉及到本人对一些 ...
随机推荐
- python编写环境(种类)
python编写环境(种类) 官方推荐 cpython 转成C的字节码 jython转成Java的字节码 ironpython转成C#字节码 pypy转换成动态编译 开发快,运行快
- WebService—— IDEA创建WebServices
一.File–>New–>Project 弹出这个对话框后,照下图的勾选然后点击Next,然后填写项目名和项目路径后,点击finish. 二.生成目录如下 需要注意的有HelloWorld ...
- hadoop hdfs 分布式存储
1.克隆前的工作 1.配置好网络nat 需要设置静态ip并能通过主机上网 ssh 和 rsync 是必须下载的 2.yum install vim wget rsync ssh 并配 ...
- flask 使用基础
转 https://blog.csdn.net/yelena_11/article/details/53404892
- java中安全的单例与不安全的单例
java中安全的单例与不安全的单例 1.内部静态类(安全的) public class Singleton { private static class SingletonHolder{ privat ...
- DFS-递归入门
[递归入门] 题目描述 已知 n 个整数b1,b2,-,bn 以及一个整数 k(k<n). 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 ...
- excache.xml作用
name:缓存名称. maxElementsInMemory:缓存最大个数. eternal:对象是否永久有效,一但设置了,timeout将不起作用. timeToIdleSeconds:设置对象在失 ...
- 随笔编号-12 阿里云CentOS7系列一 -- 安装JDK7的方法.
最近因为数据采集以及生产环境冲突.导入windows Server 2008系统经常死机.经讨论决定把采集服务程序和生产服务进行分开.采集程序通过windows Server2008运行.而生产程序通 ...
- 吃货眼中的sqlalchemy外键和连表查询
前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...
- [python]专用下划线标识符
1. python用下划线作为变量前缀和后缀,来指定特殊变量. _xxx: 不用'from module import *'导入,一般被看作是私有的,在模块或类外不可用使用. __xxx__: 系统定 ...