Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设计一个应用程序来轻松地将Hibernate与JDBC交换_Java_Hibernate_Jpa_Jdbc_Orm - Fatal编程技术网

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

Java 如何设计一个应用程序来轻松地将Hibernate与JDBC交换,java,hibernate,jpa,jdbc,orm,Java,Hibernate,Jpa,Jdbc,Orm,首先,这个问题可能是重复的 但是,既然这个问题没有得到答案,我在寻找答案,我又问了一遍 假设我们有一个使用Hibernate的应用程序,我们决定将它全部改回JDBC查询。(由于某些原因,将完全删除休眠代码和依赖项) 这样做的逻辑方式是什么?(按时间顺序一步一步地)正如评论中所指出的,这非常依赖于应用程序,但我将尝试写一些我通常会采取的步骤: 1) 向项目中添加必要的依赖项(如果您想使用普通JDBC,您可能已经有了它们,但是如果您想使用一些额外的框架,这一步可能是必要的) 2) 确定应用程序中使

首先,这个问题可能是重复的

但是,既然这个问题没有得到答案,我在寻找答案,我又问了一遍

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


这样做的逻辑方式是什么?(按时间顺序一步一步地)

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

1) 向项目中添加必要的依赖项(如果您想使用普通JDBC,您可能已经有了它们,但是如果您想使用一些额外的框架,这一步可能是必要的)

2) 确定应用程序中使用Hibernate的所有位置

3) 用JDBC准备的语句替换所有这些Hibernate查询。一个接一个地这样做,并测试它是否有效。如果正确编写查询,则替换查询应更改应用程序的行为。您可能希望首先熟悉数据库结构以避免错误

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

5) 再次测试是否一切正常

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


(或myBatis),例如,它允许您编写简化的SQL查询,而且非常容易学习。

简短回答:这没有意义

详细回答:Hibernate是一种ORM,因此它可以转换为SQL查询。例如,由Hibernate处理,因此切换到JDBC意味着您必须手动执行

使用ActiveRecord方法切换ORM是一个具有巨大开发成本的体系结构决策。任何数据访问技术都是泄漏的,因此您无法隔离数据访问代码,以便轻松地交换任何技术。出于性能考虑,您必须设计数据模型和查询,以充分利用数据库

对于中型企业应用程序,无论如何都需要特定于数据库的技术(例如CTE、窗口函数、横向联接),因此无论如何都需要原生SQL

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

回答您的问题:

您可以设计DAO接口,以便始终返回DTO,这意味着您有两种实现:

  • 冬眠刀
  • jdbcdao
这样,您将无法使用实体,因为JDBCDAO无法很好地获取实体树,因此您仍然需要手动执行

使用Hibernate进行投影只会挫败使用ORM的全部意义,因此您可能会首先质疑您的架构决策



这是高度依赖于应用程序的。为什么不试试JooQ而不是纯JDBC?@fge这不是优化或转向更高性能的解决方案,而是执行此类数据层修改的逻辑顺序,正如我在评论中所说:我必须“混合”两个应用程序,一个是用JDBC查询开发的,另一个是用Hibernate开发的。由于第一个更大,我想删除所有hibernate依赖项并坚持使用JDBC。谢谢!我必须“混合”两个应用程序,一个是用JDBC查询开发的,另一个是用Hibernate开发的。因为第一个更大,所以我更容易坚持使用JDBC。尝试一下,让我知道它是如何工作的:)但是要考虑把休眠保存在较小的应用程序中,并把它合并到大的应用程序中。如果在合并后的应用程序中配置Hibernate,您仍然可以同时使用Hibernate和JDBC。专用DAO层将应用程序与数据访问细节隔离开来。使用DTO使转换成为可能,您可以一次替换一个Hibernate DAO。最后,您可以删除Hibernate DAO并坚持使用JDBC DAO。因此,您可以运行100%的JDBC数据访问层,但在设计应用程序体系结构时,选择Hibernate是很糟糕的。应用程序的Hibernate部分将被完全删除。我想知道级联和延迟加载会如何影响查询。如果在持久化/合并实体时使用级联,那么显然需要一种方法来处理JDBC。如果您还获取了实体树并依赖于延迟加载,那么您必须调整每个用例以获取准确的投影。