繁体   English   中英

在可能的情况下,是否应该删除SQL查询以支持使用Hibernate?

[英]Where possible, should SQL queries be eliminated in favour of utilising Hibernate?

阅读了Hibernate的理论后,我多次遇到这样的想法,在理想的世界中,你不应该将Hibernate与原始的SQL查询混合在一起,原因有多种,比如Hibernate无法识别以这种方式执行的更改在正确冲洗方面有影响。

我的任务是尝试优化和改进与数据库通信的几个类,但不经过Hibernate就这样做。 他们直接使用JdbcTemplate来运行查询,我注意到这对更新语句更常见。

这是故意和良好的设计,由于某些原因,例如只更新选定数量的字段并且数据库中的对象非常大,或者我是否应该重构这些类以便它们利用DAO层类来执行这些更新疑问?

使用Hibernate与HQL (Hibernate查询语言)而不是本机查询(或Hibernate而不是JDBC)有许多好处,我说明其中3个:

  1. 多数据库支持 :如果您使用的是不同的数据库,这是一项要求,但在您的情况下,我们可以通过示例来澄清这一点。 假设您有一天会决定更改数据库引擎。 如果您的应用程序完全使用HQL,您只需在hibernate conf中切换一个参数,它将负责“重新处理”您的所有查询,因此它们与您的新数据库兼容。 只是这个。
  2. Java Objects连接:你很自我定义了这个方面( Hibernate无法识别以这种方式执行的更改,这些更改可能会对正确刷新产生影响 )。 将类和字段直接连接到数据库允许您管理更好的代码和数据库更改。 如果你的类或字段内部被更改,编译器将检查一切是否正常(我的意思是休眠方)。 如果你使用像IntelliJ这样的强大的ide,它将在另一个方向工作:如果你删除或更改数据库中的字段,你的ide会警告你类中的某些东西是错的(不是有效的列,不是有效的类型等)。
  3. 链接和安全功能 :例如,一个sql注入。 一个糟糕的书面查询可能会让您遇到安全问题,但是使用hibernate它会处理它。 它还有一个强大的缓存系统......他将毫不费力地为你做的另一件事。

希望这可以帮助

就个人而言,经过一段时间的休眠(我喜欢比仇恨更多的爱),我看到了两个主要原因,当你想要进行hibernate查询时。 可能移动到不同的数据库,查询的缓存将是另一个。 对我来说,两者都是非常有效的理由,如果这对你很重要的话。 你可能会在这里得到更多的答案为什么这是一件好事,所以我不打算告诉你更多关于这一点。 相反,我可能会告诉你为什么对于我实际遇到的情况并不总是这样。

空间查询 - 几何和地理数据类型; 有很多数据库支持这个,有时它是一个非常方便的功能 - 我真的很喜欢这方面的MSSQL,它们的索引策略,如何处理等等。没有办法在hibernate中进行这些查询,这有很多有限的设施。

Hibernate有时会隐藏更多它应该(它不是它的错); 如果你不明白hibernate会产生什么样的查询,你可能会经常感到非常惊讶。 我建议你一直查看实际的查询。 另一个例子是当你使用悲观/乐观锁时 - 总是看看查询,并不总是hibernate可能产生你期望的结果......(AzureSQL没有select for update - 它使用hints ,比如with row lock等 - 给你零保证一行将被锁定,没有适当的索引和几个资源可以锁定整个表或页面)

话虽这么说,我总是试图在这方面支持Hibernate,如果某些东西不能像我期望的那样工作 - 我使用原生查询和这样的恕我直言这个形状完美的世界根本就不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM