为MongoDB开发Hibernate/Mysql或为Java/Spring/Tomcat web应用程序开发Coach

为MongoDB开发Hibernate/Mysql或为Java/Spring/Tomcat web应用程序开发Coach,java,spring,mongodb,hibernate,nosql,Java,Spring,Mongodb,Hibernate,Nosql,我有一个正在经历大规模返工的应用程序,我一直在探索不同的选择——按原样进行,在不同的框架或平台中重做项目,等等 当我认真思考时,以下是我非常不喜欢java的三个主要方面: 修改控制器或其他类时服务器启动/停止。在这里,动态语言是对Java的巨大胜利 Hibernate、Lazyloading异常(特别是在异步服务调用或Jackson JSON编组期间发生的异常)和ORM膨胀。Hibernate本身负责缓慢的集成启动时间和极其缓慢的应用程序启动时间 Java愚蠢-与Tomcat相比,在IDE中运行

我有一个正在经历大规模返工的应用程序,我一直在探索不同的选择——按原样进行,在不同的框架或平台中重做项目,等等

当我认真思考时,以下是我非常不喜欢java的三个主要方面:

  • 修改控制器或其他类时服务器启动/停止。在这里,动态语言是对Java的巨大胜利
  • Hibernate、Lazyloading异常(特别是在异步服务调用或Jackson JSON编组期间发生的异常)和ORM膨胀。Hibernate本身负责缓慢的集成启动时间和极其缓慢的应用程序启动时间
  • Java愚蠢-与Tomcat相比,在IDE中运行应用程序时存在不一致的类加载问题。当然,一旦你解决了这些问题,你很可能再也看不到它们了。尽管如此,其中大多数都是由Hibernate引起的,因为它坚持使用特定的Antlr版本等等
  • 在考虑了这个问题之后。。。如果我摆脱了Hibernate,我可以解决或至少改善这三个方面的情况

    你们有没有人重新编写了一个50多实体的java应用程序来使用mongo、Coach或类似的数据库?那是什么样的经历?你推荐它吗?假设您有一些非常好的单元/集成测试,您花了多长时间?这个主意听起来比实际情况好吗

    如果我能够存储文档,我的应用程序实际上会在许多方面受益。它实际上会为这个应用程序打开一些非常酷和有趣的特性。但是,我确实喜欢能够为复杂的搜索创建动态查询。。。我听说沙发不能这样做

    对于NoSQL数据库,我是个新手,所以任何关于迁移(或不迁移)大型java/spring项目的建议都会非常有用。另外,如果这是一个好主意,你会推荐我读哪些书来提高我的学习速度,并以最好的方式将它们用于此应用程序


    谢谢

    嗯,这在很大程度上取决于“Hibernate的痛点到底是什么?”(我知道,你举了三个例子……)

    但从长远来看,这些并不是核心问题。您遇到的是编译语言与动态语言的本质;在运行时,它更适合您(根据我不太详尽的测试,Java比动态语言更快、更具可伸缩性),但在开发时,它不太适合只把垃圾放在一起,希望它能工作

    NoSQL不会解决问题,尽管文档存储可以,但您必须经历一个迁移步骤

    重要提示:我在该领域为一家供应商工作,这解释了我在该领域的经验,以及下一段中的偏见:


    我想,您正在关注开源项目,尽管我建议您使用一种商业产品:GigaSpaces(http://gigaspaces.com). 有一个社区版,允许您将基于JPA的java对象迁移到文档模型(通过SpaceDynamicProperties注释);您可以将JPA用于您编写的代码,并在方便的时候慢慢迁移到完全面向文档的模型,再加上复杂的查询,这不是问题。

    无论如何,您的rant不仅涵盖了以前为Hibernate做出的(遗留)决策的问题,而且还涵盖了作为程序员的一般开发问题

    如果一个类似的项目落在我的膝上,急需重构或改进,我会这样做

    这取决于你的软件生命周期中的阶段,以及你应该做出大的改变还是坚持做小的改变所涉及的时间压力。然而,从长远来看,增量迁移似乎是最好的选择

    短期内保持用Java编写应用程序似乎是明智的,用另一种语言进行重大重写肯定会破坏验收和集成测试

    就像Joseph建议的那样,从Hibernate到JPA。这不应该花费太多时间。从那里,您可以将后端切换到其他存储方式。朝着分离关注点的方向努力。选择最合适的概念,一些人更喜欢MVC,而其他人可能选择CQR,还有一些人喜欢另一种分割/分离风格

    由于JVM支持多种语言,因此您始终可以切换到其中任何一种语言,或者至少部分地用更动态的语言实现功能。这将在一定程度上解决您不断碰到Java的“愚蠢”的问题,同时仍然保留当前JVM在运行时的出色优化

    此外,您可能希望设置自动集成测试。。。由于应用程序可能永远不会从IDE运行,因此这些测试将为您提供真实的结果

    旁注:如果IDE能够将自己的库注入到我的构建或运行时路径中,我从不相信我的IDE能够正确地获得依赖项


    因此,简单地回顾一下:小步骤;失去冬眠,对JPA更抽象;如果Java变得愚蠢,那么就逐渐转向一种聪明的语言。您主要关心的应该是在不丢失功能的情况下重新构造代码库,记住采用开放式设计,这将使以后更容易添加有趣和酷的功能。

    所有这些问题通常都是由于不称职而导致的问题,而不是hibernate或java出现问题:

    • 除了结构修改(添加字段或方法)之外,java代码中的所有更改都是在调试模式下热交换的,因此您可以保存和测试(无需任何重新部署)

    • LazyInitializationException
      仅适用于hibernate初学者。有许多明确的解决方案,你可以通过简单的谷歌搜索找到它们