首先我们来看一下百度百科关于JPA的解释,JPA全称Java Persistence API。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:ORM映射元数据,API,查询语言。由此可知,Jpa是一种规范,而Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以多实现。但是我在play中定义Model时,使用的是jpa的annotations,比如javax.persistence.Entity, Table, Column, OneToMany等等。但它们提供的功能基础,有时候想定义的更细一些,难免会用到Hibernate本身的annotation。做项目要用到Hibernate。我想抛开JPA,直接使用hibernate的注解来定义Model,很快发现了几个问题:
JPA规格 定义了javax.persistence包中的JPA注释。Hibernate不仅实现了JPA规范,而且扩展了它,增加了更多的功能。所以,hibernate创建自己的注释,它们只是使用Hibernate功能来扩展JPA注释,并将这些注释放在包中org.hibernate.annotations
如果没有为该JPA注释(例如@OneToMany和@ManyToOne)添加指定的Hibernate特征,Hibernate将不会在其org.hibernate.annotations包中进行注释,javax.persistence并且必须根据JPA规范使用这些 注释。通常情况下,人们会使用JPA注释,直到遇到需要使用hibernate功能的情况。
总的来说,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。