我知道JPA 2是一个规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的特性。但从实际的角度来看,两者到底有什么区别呢?
我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我拿起Pro JPA2书,它一直提到“JPA提供商”。例如:
如果你认为一个特性应该标准化,你应该说出来
并向您的JPA提供者请求它
这让我很困惑,所以我有几个问题:
仅使用JPA2,我可以通过简单地注释POJO从DB中获取数据
JPA2应该与“JPA提供者”一起使用吗?例如TopLink或Hibernate?如果是这样,那么与单独使用JPA2或单独使用Hibernate相比,使用JPA2 + Hibernate有什么好处?
你能推荐一本好的实用的JPA2书吗?“Pro JPA2”看起来更像是JPA2的圣经和参考书(直到本书的后半部分才进入查询)。有没有关于JPA2的问题/解决方法的书?
JPA是接口,而Hibernate是实现。
传统上有多种Java ORM解决方案:
冬眠
拓联
建分办
每个实现定义自己的映射定义或客户端API。JPA专家组收集了所有这些工具中的精华,因此他们创建了Java Persistence API标准。
从客户端角度来看,标准的持久性API非常方便,可以相对容易地将一个实现转换为另一个实现(尽管实际上并没有那么简单,因为在大型项目中,无论如何都必须使用特定的非标准特性)。
标准JPA将Java ORM的竞争推向了一个新的水平,这只会导致更好的实现。
正如我在《高性能Java持久性》一书中所解释的那样,Hibernate提供了JPA还不支持的特性:
extended identifier generators (hi/lo, pooled, pooled-lo)
transparent prepared statement batching
customizable CRUD (@SQLInsert, @SQLUpdate, @SQLDelete) statements
static or dynamic collection filters (e.g. @FilterDef, @Filter, @Where) and entity filters (e.g. @Where)
mapping properties to SQL fragments (e.g. @Formula)
immutable entities (e.g. @Immutable)
more flush modes (e.g. FlushMode.MANUAL, FlushMode.ALWAYS)
querying the second-level cache by the natural key of a given entity
entity-level cache concurrency strategies
(e.g. Cache(usage = CacheConcurrencyStrategy.READ_WRITE))
versioned bulk updates through HQL
exclude fields from optimistic locking check (e.g. @OptimisticLock(excluded = true))
versionless optimistic locking (e.g. OptimisticLockType.ALL, OptimisticLockType.DIRTY)
support for skipping (without waiting) pessimistic lock requests
support for Java 8 Date and Time
support for multitenancy
support for soft delete (e.g. @Where, @Filter)
这些额外的特性使Hibernate能够满足大型企业应用程序所需的许多持久性需求。
如果没有语言的历史视角和对JCP的理解,有些事情就很难理解。
通常会有第三方开发包来执行官方JDK不包含的功能或填补空白。由于各种原因,该函数可能通过JCP (Java社区进程)成为Java JDK的一部分。
Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员更多地从持久化对象(ORM)的角度进行思考。你通知hibernate关于你的Entity对象,它会自动生成持久化它们的策略。Hibernate提供了实现和API,通过XML配置或注释来驱动实现。
现在的基本问题是,您的代码与特定的供应商(Hibernate)紧密耦合,而许多人认为这应该是更通用的。因此需要通用的持久性API。
Meanwhile, the JCP with a lot of input from Hibernate and other ORM tool vendors was developing JSR 220 (Java Specification Request) which resulted in JPA 1.0 (2006) and eventually JSR 317 which is JPA 2.0 (2009). These are specifications of a generic Java Persistence API. The API is provided in the JDK as a set of interfaces so that your classes can depend on the javax.persistence and not worry about the particular vendor that is doing the work of persisting your objects. This is only the API and not the implementation. Hibernate now becomes one of the many vendors that implement the JPA 2.0 specification. You can code toward JPA and pick whatever compliant ORM vendor suits your needs.
在某些情况下,Hibernate可能会提供JPA中没有编码的特性。在这种情况下,您可以选择直接在类中插入Hibernate特定的注释,因为JPA没有提供接口来做这件事。
来源:http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/