如何设计一个应用程序以轻松地将 Hibernate 与 JDBC 交换

How to design an application to easily swap Hibernate with JDBC

首先,这个问题可能与 Moving from hibernate to plain jdbc.

但是因为那个问题没有得到我正在寻找的答案我再问一次。

假设我们有一个使用 Hibernate 的应用程序,我们决定将其全部改回 JDBC 查询。 (Hibernate 代码和依赖项由于某种原因要完全删除)

这样做的合乎逻辑的方法是什么? (按时间先后顺序)

正如评论中所指出的,这非常依赖于应用程序,但我会尝试编写一些我通常会采取的步骤:

1) 将必要的依赖项添加到您的项目中(如果您想使用纯 JDBC,您可能已经有了它们,但如果您想使用一些额外的框架,则可能需要执行此步骤)。

2) 确定应用程序中所有使用 Hibernate 的地方。

3) 用 JDBC 准备好的语句替换所有这些 Hibernate 查询。一项一项地执行此操作并测试它是否有效。如果编写正确,替换查询应该会改变应用程序的行为。您可能需要先熟悉您的数据库结构以避免出错。

4) 重写所有查询后,从您的应用程序中删除休眠配置文件 (*.hbm.xml) 和依赖项。

5) 再次测试一切正常。

虽然我不确定您为什么要从 Hibernate 切换到 JDBC。使用一些ORM框架有很多优点。您是否看过其他一些可能更适合您的框架?

例如,

iBatis(或 myBatis)可以让你编写简化的 SQL 查询,而且非常容易学习。

简答:没有意义。

长答案:Hibernate 是一个 ORM,因此它翻译 entity state transitions into SQL queries. Things like cascading, dirty checking 由 Hibernate 处理,因此切换到 JDBC 意味着您必须手动完成。

将 ORM 转换为 ActiveRecord 方法是一种架构决策,具有显着的开发成本。任何数据访问技术都是有漏洞的,因此您无法隔离数据访问代码以便轻松地交换任何技术。出于性能方面的考虑,您必须设计数据模型和查询以充分利用数据库。

对于中型企业应用程序,无论如何您都需要特定于数据库的技术(例如 CTE、window 函数、LATERAL 连接),因此无论如何您都需要本机 SQL。

因此,最好的方法是同时使用 Hibernate 和 SQL,而不是选择其中之一。

回答您的问题:

你可以设计 DAO 接口,这样你总是 return DTO,这意味着你有两个实现:

  • 一个 Hibernate DAO
  • JDBCDAO

这样您将无法使用实体,因为 JDBC DAO 无法很好地获取实体树,所以您无论如何都需要手动完成。

将 Hibernate 用于投影只会破坏使用 ORM 的全部意义,因此您可能首先质疑您的体系结构决策。