您更喜欢Java ORM,为什么?

时间:2009-01-16 23:17:22

标签: java orm

这是一个非常开放的问题。我将开始一个新项目,并且正在查看不同的ORM以与数据库访问集成。

你有什么收藏吗? 你有没有建议保持清醒?

10 个答案:

答案 0 :(得分:226)

我已停止使用ORM。

原因不是这个概念有任何重大缺陷。 Hibernate运行良好。相反,我发现查询的开销很低,我可以将大量复杂的逻辑放入大型SQL查询中,并将大量处理转移到数据库中。

因此,请考虑使用JDBC包。

答案 1 :(得分:94)

没有,因为拥有一个ORM需要太多的控制而且收益很小。当您必须调试因使用ORM而导致的异常时,节省的时间很容易被消除。此外,ORM不鼓励开发人员学习SQL以及关系数据库的工作方式,并将其用于他们的利益。

答案 2 :(得分:85)

许多ORM都很棒,您需要知道为什么要在JDBC之上添加抽象。我可以向你推荐http://www.jooq.org(免责声明:我是jOOQ的创建者,所以这个答案是有偏见的)。 jOOQ采用以下范例:

  • SQL是一件好事。在SQL中可以很好地表达很多东西。不需要完全抽象SQL。
  • 关系数据模型是一件好事。它已被证明是过去40年来最好的数据模型。不需要XML数据库或真正面向对象的数据模型。相反,您的公司运行Oracle,MySQL,MSSQL,DB2或任何其他RDBMS的多个实例。
  • SQL具有结构和语法。它不应该使用JDBC中的“低级”字符串连接来表达 - 或者在HQL中使用“高级”字符串连接 - 这两者都容易出现语法错误。
  • 在处理主要查询时,变量绑定往往非常复杂。这是应该抽象的东西。
  • 编写处理数据库数据的Java代码时,POJO非常棒。
  • 手动编写和维护POJO很痛苦。代码生成是可行的方法。您将拥有编译安全查询,包括datatype-safety。
  • 数据库排在第一位。虽然数据库顶部的应用程序可能会随着时间的推移而发生变化,但数据库本身可能会持续更长时间。
  • 是的,您的旧数据库中确实存在过程和用户​​定义的类型(UDT)。您的数据库工具应该支持它。

还有许多其他好的ORM。特别是Hibernate或iBATIS有一个很棒的社区。但如果你正在寻找一个直观,简单的,我会说尝试一下jOOQ。你会爱上它的! : - )

查看此示例SQL:

  // Select authors with books that are sold out
  SELECT * 
    FROM T_AUTHOR a
   WHERE EXISTS (SELECT 1
                   FROM T_BOOK
                  WHERE T_BOOK.STATUS = 'SOLD OUT'
                    AND T_BOOK.AUTHOR_ID = a.ID);

如何在jOOQ中表达:

  // Alias the author table
  TAuthor a = T_AUTHOR.as("a");

  // Use the aliased table in the select statement
  create.selectFrom(a)
        .whereExists(create.selectOne()
                           .from(T_BOOK)
                           .where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
                           .and(T_BOOK.AUTHOR_ID.equal(a.ID))))));

答案 3 :(得分:57)

Hibernate,因为它基本上是Java中的事实标准,并且是创建JPA的驱动力之一。它在Spring中得到了很好的支持,几乎每个Java框架都支持它。最后,GORM是一个非常酷的包装器,它使用Groovy进行动态查找等等。

它甚至被移植到.NET(NHibernate),所以你也可以在那里使用它。

答案 4 :(得分:51)

Hibernate,因为它:

  • 很稳定 - 这么多年来,它没有任何重大问题
  • 决定ORM字段中的标准
  • 除了口述之外,
  • 实施标准(JPA)。
  • 在互联网上有大量关于它的信息。有许多教程,常见问题解决方案等
  • 功能强大 - 您可以将非常复杂的对象模型转换为关系模型。
  • 它支持任何主要和中型RDBMS
  • 很容易使用,一旦你学得很好

关于使用ORM的原因(以及何时)的几点:

  • 您使用系统中的对象(如果您的系统设计得很好)。即使使用JDBC,您最终也会创建一些转换层,以便将数据传输到对象。但我的意思是,hibernate在翻译方面比任何定制解决方案都要好。
  • 它不会剥夺你的控制权。您可以使用非常小的细节控制事物,如果API没有某些远程功能 - 执行本机查询就可以了。
  • 任何中型或大型系统都无法承受一吨查询(无论是在一个地方还是分散在一起),如果它的目的是可维护的话
  • 如果表现不重要。 Hibernate增加了性能开销,在某些情况下不能忽略。

答案 5 :(得分:25)

我建议使用MyBatis。它是JDBC上的一个薄层,很容易将对象映射到表,仍然使用纯SQL,一切都在你的控制之下。

答案 6 :(得分:18)

在编写中型JavaSE应用程序时,我对Avaje Ebean有了非常好的体验。

它使用标准JPA注释来定义实体,但是公开了一个更简单的API(No EntityManager或任何附加/分离的实体废话)。它还允许您在必要时轻松使用SQL查询或事件纯JDBC调用。

它还有一个非常好的流畅和类型安全的API查询。你可以这样写:

List<Person> boys = Ebean.find(Person.class)
                                  .where()
                                       .eq("gender", "M")
                                       .le("age", 18)
                                  .orderBy("firstName")
                                  .findList();

答案 7 :(得分:11)

SimpleORM,因为它是直截了当且没有魔力。它定义了Java代码中的所有元数据结构,并且非常灵活。

  

SimpleORM提供类似的功能   通过映射实现Hibernate的功能   关系数据库中的数据到Java   记忆中的物体。查询可以   根据Java对象指定的,   对象标识与   数据库键,关系   维护和修改对象   对象自动刷新到   带有乐观锁的数据库。

     

但与Hibernate不同,SimpleORM使用的是   非常简单的对象结构和   避免需要的架构   复杂的解析,字节码处理   等SimpleORM很小   透明,包装在两个罐子里   仅79K和52K,仅限   一个小的和可选的依赖   (SLF4J)。 (Hibernate超过2400K   再加上大约2000K的相关罐子。)   这使SimpleORM变得容易   了解并大大减少   技术风险。

答案 8 :(得分:10)

Eclipse Link,出于多种原因,但值得注意的是,我觉得它比其他主流解决方案更少膨胀(至少不那么臃肿)。

哦,Eclipse Link已被选为JPA 2.0的参考实现

答案 9 :(得分:4)

虽然我分享了有关自由格式SQL查询的Java替换的问题,但我确实认为批评ORM的人正在这样做,因为应用程序设计普遍较差。

真正的OOD由类和关系驱动,ORM为您提供不同关系类型和对象的一致映射。 如果您使用ORM工具并以ORM框架支持的任何查询语言编写查询表达式(包括但不限于Java表达式树,查询方法,OQL等),那么您肯定做错了,即您的类模型很可能不会以应有的方式支持您的要求。干净的应用程序设计实际上不需要在应用程序级别上进行查询。我一直在重构许多人们开始使用ORM框架的项目,就像他们用来在代码中嵌入SQL字符串常量一样,最后每个人都很惊讶整个应用程序匹配后的简单性和可维护性使用使用模型提升您的班级模型。当然,对于像搜索功能等一样的东西,你需要一种查询语言,但即便如此,查询也受到很大限制,以至于创建一个复杂的VIEW并将其映射到一个只读的持久化类比构建表达式更好维护和查看在您的应用程序的代码中的某些查询语言中。 VIEW方法还利用数据库功能,并且通过实现,可以比Java源中的任何手写SQL更好地提高性能。 所以,我认为没有任何理由让非平凡的申请不使用ORM。