EclipseLink文档不解释"会话"

Ros*_*les 5 java jpa eclipselink

我正在尝试使用EclipseLink执行查询,遵循http://wiki.eclipse.org/Introduction_to_EclipseLink_Expressions_%28ELUG%29中的糟糕文档,但每次需要执行表达式时,它都会使用一个名为"session"的变量,但是没有它在哪里解释这个"会话"变量来自何处.我已经有了一个persistence.xml文件,我可以在我的数据库上运行javax.persistence.Query,所以我知道连接有效,但我无法弄清楚"session"来自哪里.请帮帮忙吗?

一个侧面问题:我一直在努力让EclipseLink工作,尽管每个人都说它与Hibernate相比有多棒.EclipseLink值得我花时间和挫折,还是应该废弃它并尝试像Hibernate这样的东西?

谢谢

Pas*_*ent 5

EclipseLink 由 Oracle Toplink 捐赠给 Eclipse 基金会而诞生,与 Hibernate 一样,它是一个专有的持久性 API,早于 JPA。因此,与 Hibernate 一样,它依赖于专有引擎和专有概念或抽象。EclipseLink 的 session 就是其中之一(并且不同于 Hibernate 的 session,后者更类似于 EclipseLink UnitOfWork)。

这就是 JPA 的用武之地。JPA 提供了统一标准化的API,EclipseLink 或 Hibernate 等产品可以实现该 API。这并不意味着他们删除了专有功能,如果您不介意不可移植,您可以使用它们。发布的关于表达式的链接就是一个例子。

现在,如果你想使用和学习 JPA,你应该坚持使用 JPA(这是我的建议)。如果您想使用专有功能,则必须了解有关底层持久性引擎的知识。

关于EclipseLink的文档,即使我成功找到了我的方式,我也不能说我喜欢它,可能是因为我已经有了一些JPA的经验。但我猜这是主观的,其他人可能有不同的意见(我不同意,但正如我所说,这是主观的)。

然而,Hibernate 无疑更受欢迎,拥有更广泛的社区、更多教程等,我发现他们的文档非常好。我不知道您的选择基于什么,但是,从社区支持的角度来看,Hibernate 肯定会赢。请记住,这并不意味着您不会对 Hibernate 感到沮丧:)


MRa*_*ser 4

我建议阅读此内容

在 EclipseLink 中,有不同类型的会话。无需深入讨论细节,您可以说会话类似于事务。在 EclipseLink 中,会话通常是一个工作单元,它知道哪些实体已更改/添加/删除等。

在 JPA EntityManager 上调用以下专有 API 时,您可以在 EclipseLink 中检索此类会话:

//EntityManagerImpl has to be imported as org.eclipse.persistence.internal.jpa.EntityManagerImpl
Session session = ((EntityManagerImpl) entityManager).getActiveSession();
Run Code Online (Sandbox Code Playgroud)

在调用此方法之前,您应该确保您处于事务中。