在这篇文章中,我想向大家介绍 Jan-Willem Gmelig Meyling,一位软件开发人员和开源爱好者。

Jan-Willem Gmelig Meyling, align=

嗨,Jan-Willem。你想自我介绍一下吗?

嗨,Vlad!我叫Jan-Willem Gmelig Meyling。我是荷兰阿姆斯特丹AthenaStudies公司的一名软件开发人员。当我开始开发DevHub时,我接触到了JBoss技术栈,这是一个由荷兰代尔夫特理工大学开发的持续集成/代码仓库平台,旨在为学生提供现代软件开发的简单实用介绍。这个结构良好的API和详尽的文档,包括Java EE和Hibernate的大量示例,让我立刻被这项技术吸引。因此,我已经在WildFly/Hibernate上构建Java EE应用大约四年了。

大约两年前,我首次在我公司介绍Hibernate,并开始从我们的自定义活动记录代码迁移到Hibernate ORM。在这个过程中,我发现需要在查询中进行重投影(即从一个选择语句中选择)。我还需要实现一些递归查询,这比用原始SQL和自定义结果集映射要容易得多。经过长时间搜索,我发现了Blaze-Persistence库,它提供了一个自定义的CriteriaBuilder,允许我在Hibernate中为查询构建公共表表达式(CTEs)。CTEs允许我创建临时的参数化“表”甚至递归“表”以供查询使用。当然,当时Blaze-Persist正处于高度开发中,所以我遇到了一些问题,这促使我向Blaze-Persist做出了贡献。除了CTEs之外,Blaze-Persist还包含了许多特性,允许你编写VALUES子句,使用EntityViews创建快速实体投影,以及为查询提供内置的分页。虽然我们一直在不断改进Blaze-persist,但我们有时会遇到Hibernate中需要解决的问题或功能,因此我最近也开始为Hibernate做出贡献。但嘿,没有完美的软件,对吧?

你最近对Hibernate ORM项目做出了重大贡献。是什么驱使你改进Hibernate ORM项目?

由于广泛使用Hibernate,有时我会在StackOverflow找不到答案。在Hibernate社区中扮演更积极的角色,让我能够跟踪新功能、请求和可能影响我使用的代码更改,并总体上更容易评估某些东西是否应该工作,以及我是否应该尝试寻找解决方案或可能将其作为新功能实现。此外,由于大量使用开源软件,我认为至少尝试解决新功能或小问题是有意义的。

对我来说,另一个驱动力是尽量避免使用权宜之计。当然,我可以在映射中稍作修改,并在那里使用原生的SQL查询,但如果我们现在解决这个问题,我的同事可能无法识别这段代码的作用,可能在某个时候错误地重构它,或者在其他地方遇到相同的问题。我更愿意从根源上解决问题,这样我的软件就更容易维护,依赖项就更加稳定和功能丰富。而且,如果你可以在Hibernate代码中花几个小时,还有什么比权宜之计更有趣的呢?;-)

开始为Hibernate做出贡献是否困难?你是如何找到这个过程(GitHub、Gradle、审阅)的?

Hibernate作为一个复杂且庞大的代码库,可能会让人感到相当令人畏惧。起初对我来说确实如此!在我的经验中,总会有一些问题需要相当多的先验知识来解决,因此并不适合初学者。对于某些功能,我不得不连续几天跟踪代码,才能对特定代码段的运作有所了解。尽管如此,我认为这不应该阻止人们至少尝试解决一个问题。实际上,有些问题实际上相当容易解决。代码库非常易于阅读且文档齐全,这也帮助找到开始的地方。

该过程在代码仓库和项目网站上的README中描述得非常详细。对我个人来说,一切设置都很容易。诚然,虽然我很热情,但在fork和设置项目之后才阅读它们,这确实是我的错误。外部贡献者的审查过程相当广泛,我认为这是有道理的。代码库非常复杂,一些功能本质上需要一些讨论或至少彻底验证实现。我实际上认为,始终要求内部贡献进行审查也是一个好主意。

我认为Hibernate贡献者普遍面临的一个问题是Hibernate 5.x和6.0之间的困境。一些新功能在5.x中根本不合理,因为6.0中的某些方面被彻底重做。其他功能则简单地依赖于6.0的结构性变化。另一方面,向5.x贡献将让您能够更快地开始使用您刚刚添加的新功能。此外,似乎很难进入6.0的大门,目前的发展状态并不透明,而且并不清楚如何以及在哪里进行贡献。因此,总的来说,我认为向5.x贡献相对容易,但向6.0贡献似乎相当困难。

请告诉我们,在使用您正在工作的企业项目中使用Hibernate的经验如何?

多年来,我发现JPA及其持久化上下文、管理实体和事务处理几乎不直观。吸引人的是,它似乎非常直观,因为您已经了解您的RDBMS、BCNF、Java类型、注解,Hibernate和JPA的文档也非常好。

所以您认为自己知道自己在做什么,但实际上您并不了解。老实说,在开始使用Hibernate(或事实上是JPA)做任何事情之前,我强烈建议您至少从头到尾阅读一本Hibernate入门书。我个人阅读了Java Persistence with Hibernate (C. Bauer, 2006),它让我对JPA和Hibernate的设计和预期行为有了很多了解,并解释了我最初遇到的一些“怪癖”。

因此,现在每个新团队成员都必须至少通过一本JPA入门书。这可以为我节省大量时间,清理因不了解实体何时被跟踪以及在何时将被刷新而产生的错误代码或意外错误。

我们始终重视社区反馈,所以您可以告诉我们,您希望我们添加哪些功能,以便其他数据访问框架更容易与JPA或Hibernate集成?

通过我提交的拉取请求,我发现一些(主要是可选的)JPA功能和Hibernate扩展在使用时并不总是按预期工作。据我所知,这种兼容性没有进行文档记录。我希望看到某种功能矩阵。我还认为,我们应该将错误报告扩展到带有“规范强制”、“规范可选”、“Hibernate扩展”标志的,并基于此进行优先级排序。目前,报告者只需设置任何优先级,实际上很难在问题跟踪器中找到“重要”问题。我还认为,这是在测试套件中体现的好主意。

此外,我认为测试套件应该扩展,以更复杂地检查生成的SQL(查询数量、连接数量)以及 eager 获取的属性(从惰性加载中意外失败)。一些最近的pull请求和bug报告表明,在某些情况下,破坏惰性加载或连接获取相对容易,这引发了一个问题:我们是否应该投入更多精力来防止这些不幸的性能问题。

感谢邀请我参与!

感谢Jan-Willem抽出时间。能在这里见到您非常荣幸。要联系Jan-Willem,您可以在Twitter上关注他。


返回顶部