JPA:是规范、实现还是二者兼具?关于javax.persistence类的疑问
关于JPA规范与javax.persistence类的解惑
首先明确:javax.persistence包里的所有内容,都是JPA规范的API定义,只有契约没有具体实现。
- 注解如
@Entity、@Table:是规范规定的标记,用来告诉JPA实现框架"这个类是数据库实体"、"对应哪个数据库表",本身没有执行逻辑。 - 接口如
EntityManager:是规范定义的操作入口,里面的persist()、find()等方法只有方法签名,没有具体的数据库操作代码。
你觉得用这些API能直接跑起来,是因为你的项目里已经引入了JPA的实现框架(比如Hibernate、EclipseLink)——可能是书中示例项目默认配置了,或者构建工具(Maven/Gradle)自动帮你拉了依赖。这些实现框架会实现javax.persistence里的所有接口,并识别处理那些注解,真正完成从对象到数据库的映射、CRUD操作等工作。
举个直白的例子:JPA就像一份接口说明书,规定了"要做ORM必须有EntityManager这个操作入口,必须用@Entity标记实体";而Hibernate就是按照这份说明书写了具体的代码,当你调用EntityManager.persist()时,实际跑的是Hibernate写的插入数据库逻辑。
JPA作为规范的意义,就是让你的代码和具体实现解耦——你写的是规范API,哪天想从Hibernate换成EclipseLink,只要换依赖,业务代码不用改。
内容的提问来源于stack exchange,提问作者nonlinear
相关产品推荐
相关产品推荐

