Java生态系统提供了大量的ORM框架(水平各有不同)。虽然ORM大部分性能问题是由开发者自己引起的,但以只读方式使用ORM是不值得的。在此,我推荐一款ORM,该框架允许使用PostgreSQL的高级功能,并且代码量不大。
为了选出最佳框架,我测试了每个主流框架的功能,我决定通过测试包含以下所有功能的可用ORM框架的Demo来抉择最佳框架(我选择的项目需要与Spring集成,所以是否可以和Spring良好集成是我重点考虑的因素之一)。该Demo的所有功能大致有提供JSON支持-基于JSON的排序和过滤,支持自定义复合类型,枚举类型,数组类型,带有OUT参数的存储过程,审计用户在未知时间点创建或修改记录的可能性,还支持修订版本号,通过Spring Data Pageable类对所选记录进行分页和排序以及支持Java 8 time API类型。
几大主流ORM框架测试
以下选择的大部分框架支持所需功能,少量不支持的也可以通过代码实现,过时的框架或不包含上述功能的框架排除在该测试之外。
ActiveJDBC是活动记录模式的实现。ActiveJDBC是轻量级和易于使用的ORM框架。不幸的是,它没有与Spring事务管理集成,所以不得不编写一些代码来实现,不过相信在社区的帮助下,ActiveJDBC会发展得更好。
Apache Cayenne是一个很易于掌握的ORM框架,它从XML模型生成域对象(DO),该模型可以通过捆绑的GUI应用程序(称为建模器)进行管理。与ActiveJDBC相同,我不得不将自定义集成写入Spring事务管理(STA)。
Apache OpenJPA是Apache组织提供的JPA实现。JPA是Java EE5规范之一,是一个ORM规范,虽然Spring为OpenJPA的集成提供了轻量级的支持,但是它比Hibernate更难集成。因此,我认为在Spring中使用OpenJPA没有什么太大意义。Hibernate是使用cglib在运行期动态修改字节码来对entity进行增强,而openjpa则是在编译时字节码增强的。
DataNucleus Access Platform是一个丰富的框架,提供JPA,JDO和REST API实现。对我来说,JPA是实现它最简单的方法。该框架提供了一些映射,如Java 8 time API映射。不幸的是,映射不能在本地查询调用中使用,因此有必要编写一组额外的映射。
Ebean实际上是由Play Framework使用的灵活轻量级的ORM。即使ORM不是Spring提供的,但很容易集成。该框架也是字节码增强的。
EclipseLink是Eclipse的JPA实现。它在Spring中有一些支持,但是就像OpenJPA一样,没有什么意义。为了能够使用用户定义的类型,还不得不写一些mappers。
jOOQ是可以在Spring Initializr页面上选择的三大框架之一。 这意味着可以与Spring良好集成。ORM不仅为DO生成代码,还为用户定义的类型和存储过程生成代码。但它仍然有一些缺陷,如UDT与POJO或DAO插入方法结合时,不返回自动生成的主键值问题。另一方面,框架的作者Lukas Eder正在积极改进该框架。
MyBatis是Spring Initializr页面上提供的第三个ORM选项。MyBatis是一个成熟的轻量级框架,与Spring良好集成。不幸的是,由于它的轻量级,故而缺乏很多原生支持PostgreSQL的高级功能,不过该问题可以解决。
Hibernate在Spring Data JPA项目中用作JPA的默认实现。由于这一点,它与Spring完美集成。同时,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架。
通过自定义代码,我的意思是一个ORM允许通过一些API来使用某一特性,但是很多工作还是由开发人员完成的。自定义映射器或部分支持意味着ORM提供更高级别的API。
排除的ORM框架
以下框架由于缺乏对一个或多个所需特征的支持或者由于其他问题而被排除在测试之外。不是对这些框架有任何负面看法,只是不适合我的需要。
Exposed是JetBrains实现的用Scala开发的ORM。我试图在Jav中使用它,但它真的太难了,这几乎不可能。对于Scala开发人员,这可能是一个很好的选择。
Reladomo是一个企业ORM,但它不支持UDT或其他PostgreSQL高级功能。
Speedment当前的稳定版本不支持事务。
而以下这些框架似乎不再被开发或维护:
ActiveJPA似乎从来没有稳定的版本出现,最后一版是2014年。
Apache Torque的最后一版是在2013年。
Carbonado是一个非活跃项目。
Hydrate的最后一版是2006年。
IBM PureQuery的最后一个版是2009年。
JDO Instruments甚至没有主页。
JPOX的最后一版是2013年。
ORMLite的最后一版是2013年。
QuickDB ORM仅在Google Archive中可用,其最后一次提交是2010年。
Speedo的最后一版是2005年。
TJDO项目的最后一版是2008年。
结语
经过测试比较,最后我决定在主项目中使用jOOQ,它可以与Spring很好地集成,当然还是有一些缺点,其他开发人员也可根据需求寻找不同的框架。