我们在Web应用程序中使用JDBC已经很长时间了。我们使用它的主要原因是因为我们100%控制代码,sql和我们手中的东西。除此之外,我们在数据库中使用了触发器,数据库由数据库专家单独开发。
然而,许多人现在建议使用Hibernate
,所以我们也考虑过使用它。但是,我们发现了以下问题。
Hibernate无法连接"现有"数据库。它总是尝试创建自己的一个。
我们的数据库可能由位于不同平台(云,服务器,VPS,个人计算机)的同一应用程序访问。 Hibernate会因为在这种情况下的缓存而产生问题。
我们从不喜欢给表创建工作"到java代码。我们总是手动创建表格。
我们可能必须使用非常长且复杂的SQL语句。上次我们使用超过150行的语句,加入了20多个表。我们怀疑在Hibernate方面是否会遇到麻烦。
我们的SQL代码很好,很标准。 Hibernate生成的代码对我们来说似乎有点脏。
我们总是使用MySQL。切勿使用任何其他数据库。
我们创建的应用程序需要最高安全性,与医疗相关。如果泄露了至少一个数据记录,我们就完成了。
数据库中有很多foreign keys
,Primary Keys
,Composite Keys
,Unique Keys
等等。在论坛中,一些人抱怨说Hibernate搞砸了。
我们决定尝试休眠,因为有些人声称,"你是软件工程师吗?你已经死了JDBC
!! "
考虑到这些,请让我知道以上几点是否真实(正如我所说,我通过谷歌搜索,讨论等了解它们)或不是。而且,Hibernate VS Java JDBC的优点和缺点是什么?
答案 0 :(得分:30)
回答上面列出的问题:
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调用和程序员工具之间的逻辑和方便的面向对象层。它不会对公共网络安全产生某种影响。
答案 1 :(得分:17)
Hibernate是一个很棒的工具,你会发现很多关于它的documentations,books和blog articles。
我将解决您的所有疑虑:
Hibernate无法与“现有”数据库连接。它总是试图创建自己的一个。
即使对于integration testing,Hibernate也应该使用单独的数据库模式管理过程。您应该使用FlywayDB等增量版本控制工具来管理架构更改。
我们的数据库可能由位于不同平台(云,服务器,VPS,个人计算机)的同一应用程序访问。 Hibernate会因为在这种情况下的缓存而产生问题。
您不必使用第二级缓存,它使用第三方缓存实现。所有缓存解决方案都可能会中断transactional consistency。第一级缓存保证session-level repeatable读取,并且乐观锁定到位,您可以阻止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。
我们决定尝试休眠,因为有些人声称,“你是软件工程师吗?你正在使用已经死的JDBC !!”
这不是从你已掌握的库切换的正确论据。如果您认为可以从使用Hibernate中受益,那么这是从JDBC切换的唯一令人信服的理由。
答案 2 :(得分:3)
使用普通的旧JDBC,并不意味着您缺乏IT行业,而是Hibernate也在底层使用JDBC。
它为我们提供了什么样的优势。
1。)Cache
机制。
2。)管理sessions
,transactions
等
3。)减少编写查询的工作量,更多hibernate实用程序,如Query API
,Criteria API
,HQL
Hibernate docs或多或少涵盖了您提出的问题。
还有更多的缓存策略可用ehcache,infinispan,取决于我们正在部署的服务器,JBOSS,Weblogic,Tomcat等。++环境,如云,分布式缓存等。
Hibernate仍然为您提供关闭自动创建架构并指向您创建架构的选项。
答案 3 :(得分:1)
以下是我知道的快速答案
1)您可以连接到现有数据库。但是如上所述here
如果你没有固体物体模型,我会说Hibernate是一个 可怕的选择。
2)当您从不同的应用程序访问数据库时,您可以保持锁定。另一方面,您可以中断缓存here。
3)您可以手动创建表格并使用.hbm.xml
文件连接它。
4)您可以在hibernate中使用任何类型的查询,例如简单的SQL查询条件。
5)如果需要,可以直接在Hibernate中使用SQL代码。其他选择是使用标准。
6)Hibernate不是特定于数据库的。您可以使用任何数据库并将其与hibernate连接。
7)在数据库中使用锁和赋予权限可以保持安全性。
8)同意Hibernate中的外键很乱如果你不好处理它。所以使用OO方法并保持良好的级联,那么Hibernate将是不错的选择。