java - 在遗留世界中需要 Hibernate

标签 java hibernate orm

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




我有几个关于 hibernate 的问题。

在 stackoverflow 的许多问题中,有几个人说 hibernate 不是非常复杂的数据库的好选择。如果我们有非常复杂的数据库,hibernate 不是正确的选择。它更适合绿地项目,但对于复杂的遗留数据库则不太好。

  • 这是真的?
    hibernate 也会生成查询。
    每个项目经理都希望有优化的查询(hibernate 不能生成比 sql 专家更优化的查询!)。所以对于大项目来说,聘请sql专家不是问题。 sql专家将优化查询(使用explain sql,使用joins ...)
  • 我的问题是一个庞大而昂贵的项目为什么不关心sql优化?
    (您会说您可以编写 HQL,但正如我在很多帖子中看到的那样,这些帖子解释了 HQL 没有 sql 强大,并且许多程序员感到头疼和几个小时的调优)(您喜欢您的所有器官 body 最理想地工作不是吗?)
    此外,二级缓存对 hibernate 有很大帮助,因为 hibernate 知道生成大量查询而不是复杂的连接。
  • 我的问题是:真的是一个复杂的数据库只能由一个系统(例如网站)修改吗?如果我们谈论的是企业系统,可以通过多个进程访问数据库,共享不同的编程语言和平台。
    所以在这种情况下,二级缓存并没有多大帮助。
  • Hibernate 适合什么样的项目?
    是用于没有人关心 sql 的后台项目吗?
  • 当您的管理员说:请使用 memcached 进行缓存并请使用此优化查询而不是您的查询时会发生什么?

  • 如果你使用oracle数据库,orache有最先进的sql语法。他们在非常强大的语法上花费了大量时间和金钱。如果不使用此语法,它的用途是什么。

    软件只编写一次(然后维护)并使用很长时间。
    如果我是一家订购软件的公司,我会说:我会用几年的软件,我喜欢快,如果你花 1 个月的时间用 hibernate 编写软件,我会为使用的软件多付一个月的费用示例 IBATIS 知道它会更好地工作多年
    (当您购买汽车时,您对汽车经济性 1kg-oil/km 感兴趣,而不是制造商生产汽车的时间和容易程度!)。因此,作为软件消费者,我对您的生产力不感兴趣,我对软件的速度不感兴趣。当然,价格也是相关的,但如果我们谈论价格,则有更复杂的数学。

    当我们真的无法预测系统的某些部分时,我们可以称之为工程吗?
    (如果电气工程师无法预测电流,他真的可以成为工程师吗?)

    请分享您的意见。

    问候

    最佳答案

    1) (...) Is this true?



    不,它不是,Hibernate 可以处理非常复杂的数据库,包括现有的数据库。但是,它可能无法很好地处理严重非规范化的数据库或奇异的模式。这是不同的。

    2) (...) My question is how come a huge and expensive project does not care about sql optimization?



    这是无稽之谈,使用 Hibernate 并不意味着您不关心优化。我曾在一个庞大而复杂的 STP 系统(数亿欧元的预算)上工作,性能绝对是一个重要的问题,我们实际上引入了 Hibernate 以从延迟加载、二级缓存(和加速开发)等方面受益。

    这是使用像 Hibernate 这样的 ORM 时的交易(在合适的情况下):
  • 使用 ORM 会比不使用 ORM 更快(或者使用它们没有任何意义)。
  • 绝大多数生成的查询都会正确运行(事实上,Hibernate 生成 比一般开发人员更好的 SQL)。
  • 您可以(并且必须)在一定程度上调整查询和 Hibernate。
  • 即使您花一些时间在性能优化上(包括为真正有问题的查询回退到 native SQL),您仍然会做得更快。

  • 3) (...) So in this case the second level cache does not help very much.



    嗯,您对使用二级缓存在理想情况下意味着使用 Hibernate API 的事实是正确的(尽管您仍然可以“手动”驱逐缓存,尽管我倾向于将它用于“主要读取”实体)。但是,更重要的是,根据我的经验,通过数据库在许多应用程序之间共享数据只会导致无法维护的应用程序(更改单个位变得不可能,因为它可能会影响多个应用程序)并且应该避免。使用 EAI/ESB 并通过它公开主系统的服务。这样,您就可以重用业务逻辑、二级缓存等。

    4) (...) For what kind of projects hibernate is suitable for? Is it for back office projects where nobody cares about the sql ?



    Hibernate 对于 CRUD 应用程序确实非常好,但不仅(见上文)而且您的问题显示了我已经说过的一些无知。但是,它不适合任何项目:
  • 我可能不会将它用于数据仓库或大型报告应用程序。
  • 我可能不会将它与严重非规范化或异国情调的遗留数据库一起使用(在这种情况下,像 mybatis 这样的数据映射器可能是更好的选择)。
  • 我可能不会将它与使用存储过程的现有系统一起使用。
  • 我不会将它与非 RDBMS 数据存储一起使用 :)

  • 5) (...) What happens when your administrator says: please use memcached for caching and please use this optimized queries instead of yours?



    我告诉他,在我们的上下文中,memcached 可能不是最好的解决方案(不,我不想总是通过网络发送我的数据,我不在乎 Facebook/LiveJournal/Twitter/任何正在使用它的东西,我们的应用程序可能有不同的需求),在使用 Hibernate 时还有其他更好的缓存实现,我请他和我讨论问题,我们讨论各种解决方案等。我们作为一个团队工作,而不是相互对抗。

    总而言之,ORM 解决方案并不总是合适的,但我认为您目前有偏见,我的经验与您的问题中表达的意见(错误信念?)不同。

    也可以看看
  • When NOT to use O/R mapping in Java
  • 关于java - 在遗留世界中需要 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269057/

    相关文章:

    java - 如何构建可嵌入类型的 ElementCollection?

    java - Else 语句仅在奇数输入上给出输出

    java - Hibernate 查询中出现错误。错误 : org. hibernate.hql.ast.QuerySyntaxException

    java - Grails/GORM 2.3 Hibernate 寻找抽象域类持久化表

    php - 如何使用 Propel ORM 来 Zend Framework

    java - Android Wear - 以编程方式启用/禁用环境模式

    带有用户定义变量的 Java 控制台计算器

    Hibernate Spatial - 在 X 公里半径内查询?

    java - Postgres 和 JPA 命名查询 - WHERE 中的任何 (*) 值

    php - Symfony/查询生成器 : "myEntityAlias.myEntity.id" <- possible?