在这篇文章中,我想向大家介绍克里斯蒂安·贝科夫,他是Hibernate最活跃的贡献者之一。

Christian Beikov, align=
  1. 你好,克里斯蒂安。你愿意介绍一下自己,并告诉我们一些你的开发经验吗?

    嗨,瓦拉德。我叫克里斯蒂安·贝科夫,25岁。我和我的女朋友住在维也纳,奥地利的首都。我在学校开始使用Java EE技术,并在我的第一份工作中继续这样做,我现在仍在兼职工作。除了我的工作外,我在维也纳技术大学(TU Wien)攻读软件工程硕士学位,希望明年完成。

    我的主要兴趣在于分布式系统、数据库技术以及与Java/JVM相关的所有内容。在学校,我在开发基于JSF的Web应用时第一次接触到Java EE,使用了Hibernate、GlassFish和NetBeans。我开始在Curecomp GmbH工作时,主要使用Eclipse和WebSphere,大约两年前,我成功地将公司的开发堆栈完全迁移到WildFly和IntelliJ IDEA。在这些迁移以及无数我在其中使用了Hibernate的大学项目作业中,我遇到了一些或大或小的错误。

  2. 你在Hibernate生态系统中的参与非常积极,发送Pull Requests并参与未来的设计讨论。你是如何将开源参与与你的日常工作相结合的?

    我在开源项目中进行的工作大多是在我的业余时间。我喜欢为社区做出贡献,哪怕只是错误报告。由于我在许多项目中都使用了Hibernate,我认为我的贡献是对我所做项目整体质量的一种投资。

    在我日常工作中,我有时会遇到一些我无法绕过的问题,或者修复这些问题对我来说同样困难,这就是我修复Hibernate核心错误的原因。我从分析错误和讨论功能中获得的深入知识也帮助我在日常工作中推理Hibernate在特定情况下的行为,这是一大优势。

  3. 您还在开发Blaze Persistence。您能简单介绍一下这个框架以及它与Criteria API相比有哪些不同吗?

    Blaze-Persistence是基于JPA API的库。核心模块提供了一个流畅的查询构建器API,允许您使用Java DSL以更直观的方式表达查询。除了JPA 2.1中定义的标准功能外,它还实现了对一些常用功能的支持,例如别名获取连接或实体连接。在此基础上,Blaze-Persistence还提供了与JPA提供者的深度集成,以支持递归CTE或集合操作(如UNION)等特性。请注意,深度集成目前仅适用于Hibernate,因为这是我最熟悉的提供者,但计划支持其他提供者。

    Blaze-Persistence的一个最突出的特性是实体视图,这在JPA实体中的作用类似于RDBMS中的视图。实体视图是一个接口或抽象类,它表示实体的投影结构。它基本上是DTO的定义,区别在于您只需指定getter方法和该属性的投影JPQL表达式。当您将实体视图应用于基本查询时,它将作为选择项贡献JPQL表达式,从而创建优化的JPQL和SQL查询。此类查询的结果当然是实体视图子类型对象列表。除了避免所有手动管道代码以使数据成形外,您还可以使用集合映射、子视图或子查询提供者等特性,这些特性使您能够定义复杂的投影,这在通常情况下是不容易做到的。

    JPA提供的Criteria API难以使用,因为它需要大量输入和一定的技能。您需要了解如何连接组件,这是我想通过引入流畅API解决的问题之一。当然,JPA Criteria API是类型安全的,但这是以使查询难以理解为代价的。Blaze-Persistence核心API的类型安全版本,或者甚至只是现有API中的某些附加方法已经在我的路线图上,所以我也会尽力填补这个空白,同时保持可读性。

    由于我不期望每个人都重写他们现有的基于JPA Criteria API的查询,我也在Blaze-Persistence核心API之上实现了JPA Criteria API。您甚至可以让现有的代码使用JPA Criteria API构建查询,并从中检索Blaze-Persistence查询构建器。结果查询构建器可以像任何其他查询构建器一样使用,这意味着您可以使用CTE和其他所有优秀功能。

  4. Blaze Persistence与任何JPA提供者兼容。根据您的经验,Hibernate ORM与EclipseLink或OpenJPA相比如何?

    作为免责声明,我没有深入研究其他JPA提供者的社区,因为我没有在我的任何项目中使用它们。此外,请注意,我可能存在偏见,因为我认识Hibernate团队的人,并且知道在有问题时如何联系他们,但我会尽量保持中立。

    我有一种感觉,EclipseLink社区对我的错误报告或论坛帖子不感兴趣,但除了这一点之外,实现似乎还可以。它有一些怪癖,例如例如允许延迟加载,尽管底层实体管理器已关闭,但这可能是一个特性 :D

    数据核(DataNucleus)是鲜为人知的JPA提供者之一,但实际上相当不错。那里的主要开发者对错误报告的反应速度非常快。我发现了一些错误,并提出了一些增加Hibernate兼容性的功能,据我所知,所有这些问题都已经解决。

    我对OpenJPA的了解不多,除了它在我看来说明它已经死了,或者只是处于维护模式。最新版本只兼容JPA 2.0,而且不幸的是,甚至缺乏其他JPA提供者可以做到的某些私有方式。

    我主要不满意的是,我在任何JPA提供者中发现的大部分问题都是非常基本的事情,应该由JPA TCK断言。我希望某个能够真正做些事情的Oracle员工能读到这篇帖子,并更努力地推动JPA TCK开源:)

  5. 我们始终重视用户的反馈,你能告诉我们你希望我们改进什么,或者有哪些特性我们应当支持吗?

    我认为Hibernate已经做得很好了。我真的希望看到SQL生成和执行与ORM特定内容的解耦。这是我在处理错误或简单执行特定任务所需的SQL时经常需要做的事情。想象一下,你可以指定一个HQL查询,它只是描述了结果映射应该如何完成,但你指定了自己的SQL。这是我在Blaze-Persistence中经常为高级查询内部进行的事情。我希望Hibernate 6计划中的SQM功能能够让我做到这一点,这样我就可以摆脱我现在为了完成任务不得不使用的脏技巧。

感谢你,Christian,抽出时间。能在这里见到你是一种极大的荣幸。要联系Christian,你可以通过Twitter关注他。


返回顶部