JDBC VS Hibernate

我们在Web应用程序中使用JDBC已经很长时间了。 我们使用它的主要原因是因为我们100%控制代码,sql和我们手中的东西。 除此之外,我们在数据库中使用了触发器,数据库由数据库专家单独开发。

然而,许多人现在建议使用Hibernate所以我们也考虑使用它。 但是,我们发现了以下问题。

  1. Hibernate无法连接“现有”数据库。 它总是试图创建自己的一个。

  2. 我们的数据库可能由不同平台(云,服务器,VPS,个人计算机)中的同一应用程序访问。 Hibernate可能因为在这种情况下的缓存而产生问题。

  3. 我们从不喜欢将“表创建工作”赋予java代码。 我们总是手动创建表。

  4. 我们可能必须使用非常长且复杂的SQL语句。 上次我们使用超过150行的语句,加入了20多个表。 我们怀疑在Hibernate方面是否会遇到麻烦。

  5. 我们的SQL代码很好,很标准。 Hibernate生成的代码对我们来说似乎有点脏。

  6. 我们总是使用MySQL。 切勿使用任何其他数据库。

  7. 我们创建的应用程序需要最高安全性,与医疗相关。 如果泄漏了至少一个数据记录,我们就完成了。

  8. 数据库中有很多foreign keysPrimary KeysComposite KeysUnique Keys等。 在论坛中,一些人抱怨说Hibernate搞砸了。

  9. 我们决定尝试hibernate,因为有些人声称,“你是软件工程师吗?你正在使用已经死的JDBC !!”。

考虑到这些,请让我知道以上几点是否真实(正如我所说,我通过谷歌搜索,讨论等了解它们)或不是。 而且,Hibernate VS Java JDBC的优点和缺点是什么?

回答上面列出的问题:

1. Hibernate无法与“现有”数据库连接。 它总是试图创建自己的一个。

这是错的。 Hibernate 可以连接到现有数据库,并不总是尝试重新创建它。 你应该像hbm2ddl. auto那样转动参数hbm2ddl. auto hbm2ddl. auto

2.我们的数据库可能由位于不同平台(云,服务器,VPS,个人计算机)的同一应用程序访问。 Hibernate可能因为在这种情况下的缓存而产生问题。

Hibernate有一个可调缓存,所以这也不是问题。

3.我们从不喜欢将“表创建工作”赋予java代码。 我们总是手动创建表。

没问题。 见上面的第1页。 此外,还有几个方便的库用于间接表创建和更新(例如liquibase ),可以完美地与hibernate结合使用。

我们可能不得不使用非常冗长和复杂的SQL语句。 上次我们使用超过150行的语句,加入了20多个表。 我们怀疑在Hibernate方面是否会遇到麻烦。

如果需要,您可以始终使用直接JDBC调用并通过hibernate调用本机SQL查询。

5.我们的SQL代码很好,很标准。 Hibernate生成的代码对我们来说似乎有点脏。

同样,如果你必须调用一些逻辑复杂的SQL代码而不是自动生成的hibernate – 你可以这样做。

6.我们总是使用MySQL。 切勿使用任何其他数据库。

根本不是问题。 Hibernate有特殊的MySQL方言支持: org.hibernate.dialect.MySQLDialect

7.我们创建的应用程序需要最高安全性,与医疗相关。 如果泄漏了至少一个数据记录,我们就完成了。

安全问题与ORM技术无关。 Hibernate只是纯数据库JDBC调用和程序员工具之间的逻辑和方便的面向对象层。 它不会以某种方式影响常见的网络安全。

Hibernate是一个很棒的工具,你会发现很多关于它的文档 , 书籍和博客文章 。

我会解决你所有的问题:

Hibernate无法连接“现有”数据库。 它总是试图创建自己的一个。

即使是集成测试, Hibernate也应该使用单独的数据库模式管理过程。 您应该使用像FlywayDB这样的增量版本控制工具来管理架构更改。

我们的数据库可能由不同平台(云,服务器,VPS,个人计算机)中的同一应用程序访问。 Hibernate可能因为在这种情况下的缓存而产生问题。

您不必使用第二级缓存,它使用第三方缓存实现。 所有缓存解决方案都可能会破坏事务一致性 。 第一级缓存保证了会话级可重复读取,并且在乐观锁定的情况下,您可以防止丢失更新 。

我们从不喜欢将“表创建工作”赋予java代码。 我们总是手动创建表。

数据库管理应与ORM工具分开。 无论如何,这是最好的做法。

我们可能必须使用非常长且复杂的SQL语句。 上次我们使用超过150行的语句,加入了20多个表。 我们怀疑在Hibernate方面是否会遇到麻烦。

Hibernate非常适合写操作和并发控制。 您仍然需要使用本机SQL进行高级查询(窗口函数,CTE)。 但是Hibernate允许您运行本机查询。

我们的SQL代码很好,很标准。 Hibernate生成的代码对我们来说似乎有点脏。

您不需要也不应该使用hbmdll实用程序。

我们总是使用MySQL。 切勿使用任何其他数据库。

那更好。 因此,您可以使用高级本机查询,而无需担心数据库可移植性问题。

我们创建的应用程序需要最高安全性,与医疗相关。 如果泄漏了至少一个数据记录,我们就完成了。

Hibernate不会阻止您保护数据库或数据访问代码。 您仍然可以使用Hibernate的数据库安全措施。 您甚至可以使用Jasypt启用各种与安全相关的function:

  • 高级密码哈希
  • 双向加密

数据库中有很多外键,主键,复合键,唯一键等。 在论坛中,一些人抱怨说Hibernate搞砸了。

所有这些都得到了Hibernate的支持。 除了JPA约定之外,Hibernate还为任何奇异的映射提供特定的映射。

我们决定尝试hibernate,因为有些人声称,“你是软件工程师吗?你正在使用已经死的JDBC !!”。

这不是从您已经掌握的库切换的正确论据。 如果您认为可以从使用Hibernate中受益,那么这是从JDBC切换的唯一令人信服的理由。

使用普通的旧JDBC并不意味着您缺乏IT行业,而是Hibernate也在底层使用JDBC。

它为我们提供了什么样的优势。

1.) Cache机制。

2.)管理sessionstransactions等。

3.)减少编写查询的工作量,更多的Hibernate实用程序,如Query APICriteria APIHQL

您提出的问题或多或少都包含在Hibernate文档中 。

另外还有更多的缓存策略可用ehcache,infinispan,取决于我们正在部署的服务器,JBOSS,Weblogic,Tomcat等。++环境,如云,分布式缓存等。

Hibernate仍然为您提供关闭自动创建模式并指向您创建模式的选项。

以下是我所知道的快速答案

1)您可以连接到现有数据库。 但是如上所述

如果你没有可靠的对象模型,我会说Hibernate是一个糟糕的选择。

2)由于您从不同的应用程序访问数据库,因此您可以维护锁定。 另一方面,你可以在这里完成缓存。

3)您可以手动创建表并使用.hbm.xml文件进行连接。

4)您可以在hibernate中使用任何类型的查询,例如简单的SQL查询条件。

5)如果需要,可以直接在Hibernate中使用SQL代码。 其他选择是使用标准。

6)Hibernate不是特定于数据库的。 您可以使用任何数据库并将其与hibernate连接。

7)在数据库中使用锁和赋予权限可以保持安全性。

8)同意外键在Hibernate中很乱, 如果你不好处理它 。 所以使用OO方法并保持良好的级联,那么Hibernate将是不错的选择。