hibernate 和eclipselink的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 和eclipselink的区别相关的知识,希望对你有一定的参考价值。
参考技术A HibernateHibernate 是一个开放源代码的对象/关系映射框架和查询服务。它对 JDBC 进行了轻量级的对象封装,负责从 Java 类映射到数据库表,并从 Java 数据类型映射到 SQL 数据类型。在 4.0 版本 Hibenate 开始支持多租户架构——对不同租户使用独立数据库或独立 Sechma,并计划在 5.0 中支持共享数据表模式。
在 Hibernate 4.0 中的多租户模式有三种,通过 hibernate.multiTenancy 属性有下面几种配置:
NONE:非多租户,为默认值。
SCHEMA:一个租户一个 Schema。
DATABASE:一个租户一个 database。
DISCRIMINATOR:租户共享数据表。计划在 Hibernate5 中实现
EclipseLink
EclipseLink 是 Eclipse 基金会管理下的开源持久层服务项目,为 Java 开发人员与各种数据服务(比如:数据库、web services、对象XML映射(OXM)、企业信息系统(EIS)等)交互提供了一个可扩展框架,目前支持的持久层标准中包括:
Java Persistence API (JPA)
Java Architecture for XML Binding (JAXB)
Java Connector Architecture (JCA)
Service Data Objects (SDO)
EclipseLink 前身是 Oracle TopLink, 2007年 Oracle 将后者绝大部分捐献给了 Eclipse 基金会,次年 EclipseLink 被 Sun 挑选成为 JPA 2.0 的参考实现。
注: 目前 EclipseLink2.5 完全支持 2013 年发布的 JPA2.1(JSR 338) 。
在完整实现 JPA 标准之外,针对 SaaS 环境,在多租户的隔离方面 EclipseLink 提供了很好的支持以及灵活地解决方案。
应用程序隔离
隔离的容器/应用服务器
共享容器/应用服务器的应用程序隔离
同一应用程序内的共享缓存但隔离的 entity manager factory
共享的 entity manager factory 但每隔离的 entity manager
数据隔离
隔离的数据库
隔离的Schema/表空间
隔离的表
共享表但隔离的行
查询过滤
Oracle Virtual Private Database (VPD)
对于多租户数据源隔离主要有以下方案
Single-Table Multi-tenancy,依靠租户区分列(tenant discriminator columns)来隔离表的行,实现多租户共享表。
Table-Per-Tenant Multi-tenancy,依靠表的租户区分(table tenant discriminator)来隔离表,实现一租户一个表,大体类似于上文的共享数据库独立Schema模式。
Virtual Private Database(VPD ) Multi-tenancy,依靠 Oracle VPD 自身的安全访问策略(基于动态SQL where子句特性),实现多租户共享表。
推荐阅读这篇文章:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/,讲的不错。
用于 JPA 的 Hibernate 或 EclipseLink? [关闭]
【中文标题】用于 JPA 的 Hibernate 或 EclipseLink? [关闭]【英文标题】:Hibernate or EclipseLink for JPA? [closed] 【发布时间】:2011-03-15 04:07:16 【问题描述】:我想知道是否有人对这些框架的 JPA2.0 实现有经验?特别是与带有 EclipseLink 支持的 Spring3.x 一起使用。
您是否将这些框架和 JPA2.0 用于生产?有任何严重问题吗?
【问题讨论】:
【参考方案1】:EclipseLink 更符合标准,因为它是 JPA 2 的参考实现,Hibernate 存在一些合规性问题,但更成熟。
EclipseLink 的主要优点之一是您可以直接在 JPQL 查询中调用本机 SQL 函数。在 Hibernate 中,这是不可能直接实现的。
但 Hibernate 拥有更大的社区、更好的文档以及更好的错误消息。
【讨论】:
我不同意。作为 RI 并不会让您更加合规,尽管它们应该符合 JPA 2.0,但我都遇到了这两种实现的问题,请参阅this question for example。 TCK 并不详尽。 嗯,我提出问题的原因是我认为也存在合规问题。 Pascal 已经尝试过提供帮助,但没有奏效(请参阅***.com/questions/3225103/…)。简而言之,我正在尝试使用可为空的属性,而 Hibernate/MySQL 的行为不像预期的那样。我已经用 EclipseLink(相同的代码)尝试了同样的方法,它可以工作。但是,您说 EcipeLink 有它自己的问题。那是真的,真的很难过。是否恰当地说:最好不要使用 JPA2 而是使用纯 Hibernate 语法? @erlord,如果这是 Hibernate 错误,请将其作为问题提交到 Hibernate JIRA。我仍然会继续使用 JPA 注释和基于注释的配置。 @Timo 我同意 Hibernate 与 JPQL @erlord 存在一些“故障”我在所有主要的 JPA 实现中都遇到过错误,并且相信随着时间的推移情况会变得更好,我仍然继续使用 JPA。在您的特定情况下,我建议无论如何都使用Float
以便能够在对象级别将其设置为null
。但是确实有一个bug,你应该报告它。
@all:请考虑一下我在***.com/questions/3225103/… 上对前面提到的问题的自我回答……这不是休眠错误,而是我能力的错误;-) 因此,我将携带使用 Hibernate,只是因为更大的社区,使用 JPA2,因为它是标准的【参考方案2】:
恕我直言,尽可能使用标准 api 总是更好。您自己的示例完美地说明了这一点。当一个提供商未能按预期工作时,您可以在两个提供商上尝试相同的代码。切换到任何本机 API 会阻止您执行此操作。
如果使用 EclipseLink 作为您的 JPA 2.0 提供程序非常适合您,那么请使用它。如果您确实遇到了问题,请提交 EclipseLink 错误,并在此论坛或 EclipseLink 论坛和新闻组上获得帮助。
【讨论】:
【参考方案3】:根据我的经验,使用 Java Perf Profiling。 我使用 Eclipselink 构建的应用程序在数据插入和检索方面的性能似乎都比使用 Hibernate 好得多。然而,Hibernate 使用更广泛,并提供了更大的支持论坛。
在生产中,出于这个原因,我将简单地使用 Hibernate。
【讨论】:
【参考方案4】:只需选择并坚持一个。标准只是最终的指导方针,每个实施者都可以相应地实施或不实施标准。
例如
EclipseLink 在使用诸如 JPA @Converter
s 之类的基本内容时遇到问题,但据说最近已通过 IBM http://www-01.ibm.com/support/docview.wss?uid=swg1PI73277 修复
Hibernate 的 JPQL 实现不理解独立的布尔值,更具体地说,我不得不更改我的 JPQL 来表示
from Participant p where not p.cancelled
到
from Participant p where p.cancelled = false
另一件事是您在 Spring 中构建东西,您可能会采用不正确但常见的方法将类加载器更改为 PARENT_LAST
顺序,以便使用您的类而不是应用程序服务器。
如果您打算以正确的方式使用应用程序服务器附带的 JPA,请注意您的应用程序服务器实现可能存在错误。
您的应用程序的事务明智,特别是 Spring 必须为您处理事情。
【讨论】:
以上是关于hibernate 和eclipselink的区别的主要内容,如果未能解决你的问题,请参考以下文章
使用SpringDataJpa和Hibernate / eclipselink时entityManager的行为
EclipseLink 相当于 Hibernate 的 NaturalID 概念
如何在 EclipseLink 中引用自定义的“ConnectionProvider”?
eclipselink.weaving 属性的值和区别是啥?
JPA 是规范 Eclipselink and hibernate its implementation 它与 Spring 事务管理有啥关系?