【问题标题】:JDBC VS Hibernate [closed]JDBC VS休眠[关闭]
【发布时间】:2023-03-25 19:41:01
【问题描述】:

我们在 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+3:您不必让 Hibernate 为您创建表。 2:您不必使用缓存。 4+5:我明白了。也许你想看看 jOOQ。用于手写 SQL 的类型安全 Java DSL,无需进入 ORM。 6:Hibernate 支持 MySQL。 7:这似乎是一个完全独立的问题(与您使用的数据库访问库无关)
  • @Alex:感谢您的回复。我又加了2分,请看一下。
  • @Thilo:感谢您的评论。我又加了2分,请看一下。
  • 显然这不是 JDBC 或 Hibernate 的问题。它是 JDBC 或 JPA。你知道,一些 JPA 实现与 Hibernate 做的事情不同。也许你可以对其他事情敞开心扉……

标签: java mysql hibernate jpa jdbc


【解决方案1】:

回答上面列出的问题:

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

这是错误的。 Hibernate 可以连接到现有的数据库,它并不总是尝试重新创建它。你只需要像hbm2ddl. auto这样的参数。

2.我们的数据库可能会通过不同平台(云、服务器、VPS、个人计算机)中的相同应用程序访问。在这种情况下,由于它的缓存,Hibernate 可能会出现问题。

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

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

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

4.我们可能不得不使用非常长且复杂的 SQL 语句。上次我们使用了一个超过 150 行的语句,连接了 20 多个表。我们怀疑在涉及到 Hibernate 时我们是否会在这方面遇到麻烦。

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

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

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

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

完全没有问题。 Hibernate 有特殊的 MySQL 方言支持:org.hibernate.dialect.MySQLDialect

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

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

【讨论】:

    【解决方案2】:

    这是我知道的快速答案

    1) 您可以连接到现有数据库。但是是的,正如here

    如果您没有实体对象模型,我会说 Hibernate 是一个 糟糕的选择。

    2) 当你的数据库被不同的应用程序访问时,你可以维护锁。另一方面,您可以像 here 那样关闭缓存。

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

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

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

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

    7) 在数据库中使用锁和授予权限可以维护安全性。

    8) 同意 Hibernate 中的外键是混乱的如果你处理不好。所以使用 OO 的方式,并且维护好级联,那么 Hibernate 将是一个不错的选择。

    【讨论】:

    • solid object model 是什么意思?
    • solid object model 我的意思是您将数据库映射到 JAVA 文件上 面向对象的方式,即保持关系并以 OO 方式映射外键。
    【解决方案3】:

    使用plain old JDBC,并不代表你在IT行业中缺乏,而是Hibernate在底层也使用了JDBC。

    它为我们提供了哪些我们应该寻找的优势。

    1.) Cache 机制。

    2.) 管理sessionstransactions 等。

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

    Hibernate docs 或多或少涵盖了您提出的问题。

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

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

    【讨论】:

      【解决方案4】:

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

      我会解决你所有的问题:

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

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

      我们的数据库可能会被不同平台(云、服务器、VPS、个人电脑)中的相同应用程序访问。在这种情况下,由于它的缓存,Hibernate 可能会出现问题。

      您不必使用使用 3rd 方缓存实现的 2 级缓存。所有缓存解决方案都可能破坏事务一致性。第一级缓存保证会话级的可重复读取,并且通过适当的乐观锁定,您可以防止lost updates

      我们从不喜欢将“创建表的工作”交给 java 代码。我们总是手动创建表格。

      数据库应与您的 ORM 工具分开。无论如何,这是一个最佳实践。

      我们可能不得不使用非常长且复杂的 SQL 语句。上次我们使用了一个超过 150 行的语句,连接了 20 多个表。我们怀疑在涉及到 Hibernate 时我们是否会在这方面遇到麻烦。

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

      我们的 SQL 代码既美观又标准。 Hibernate 生成的代码对我们来说似乎有点脏。

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

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

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

      我们创建的应用程序需要与医疗相关的最大安全性。如果至少有一条数据记录被泄露,我们就完蛋了。

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

      • 高级密码散列
      • 双向加密

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

      Hibernate 支持所有这些。除了 JPA 约定,Hibernate 还为任何外来映射提供 particular mapping

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

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

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2011-05-01
        • 2010-11-24
        • 2013-05-20
        • 2011-05-01
        • 2015-06-08
        • 2010-12-31
        • 2017-06-23
        • 2014-12-14
        相关资源
        最近更新 更多