在Java中使用哪个ORM框架? - Reddit

22-09-11 banq

1、 JPA API,  Hibernate的实现,最受欢迎和足够好。

2、JdbcTemplate - 虽然不是真正的 ORM,但您必须自己编写所有查询 + 自己进行映射。我认为最好的选择,因为如果你了解 SQL,你可以 100% 控制它,不像 Hibernate,我看到开发人员犯了可怕的错误和反模式。

3、Spring Boot、JPA 存储库、Hibernate,但只需放入 id。像避免瘟疫一样避免关联和集合。
作为参考,我在 2004 年写了一本关于 Hibernate 的书,并一直在使用它。在调试性能问题和奇怪的异常一百万次之后,发现保持简单(有些人称之为贫血模型)在实践中效果最好。使用 Spring 缓存和/或 Redis 进行缓存/性能。
有趣的是,Hibernate 的创建者最近一直在推特上谈论 Hibernate 无状态会话的乐趣。我真希望我可以把所有的压力和时间都浪费在对抗糟糕的一级和二级缓存抽象上。

4、我经常使用Hibernate,并学会了远离某些东西。二级缓存是一种反模式的做法。如果你需要扩展,可以使用TiDB、Cockroach或Percona,在那里你可以按键分片数据表。
如果你遵循一些规则,我不觉得关系很麻烦。最大的问题是没有多对多的关系和没有急加载。
除非你要求,否则Hibernate Reactive永远不会加载关系。我希望有一个配置选项可以让普通的Hibernate这样做。
我们也有一个SPI集成,我们把它复制粘贴到所有的项目中,如果你试图加载一个有大量项目的集合关系时,它会吐出警告。这使我们避免了大多数的集合加载问题(除了many-many,这在我看来是个错误)。
使用一个在所有实体之间共享的简单的Equals和Hashcode实现也非常重要,它只检查ID。
我认为Hibernate最大的问题是缺乏 "最佳实践 "指南,没有告诉你哪些东西是不好用的。

5、Spring Data JDBC在JDBC的基础上做得很好,可以与数据表记录一起工作,并提供了一个转换器API来处理晦涩的数据类型。每当它不够用时,我就会退回到使用JdbcTemplate来运行查询。
JOOQ 非常有趣,但我喜欢靠近 SQL。对于我迄今为止处理的用例,本机查询总是比基于 ORM 的解决方案更快。不过,这并不是对使用 ORM 的批评。它们在某些情况下占有一席之地。
此外,JOOQ 要求我学习另一种 DSL,而我对 SQL 非常熟悉。使用 Spring Data JDBC 不需要我学习新东西。