这是一个非常开放的问题。我将开始一个新项目,并且正在查看不同的ORM以与数据库访问集成。
你有什么收藏吗? 你有没有建议保持清醒?
答案 0 :(得分:226)
我已停止使用ORM。
原因不是这个概念有任何重大缺陷。 Hibernate运行良好。相反,我发现查询的开销很低,我可以将大量复杂的逻辑放入大型SQL查询中,并将大量处理转移到数据库中。
因此,请考虑使用JDBC包。
答案 1 :(得分:94)
没有,因为拥有一个ORM需要太多的控制而且收益很小。当您必须调试因使用ORM而导致的异常时,节省的时间很容易被消除。此外,ORM不鼓励开发人员学习SQL以及关系数据库的工作方式,并将其用于他们的利益。
答案 2 :(得分:85)
许多ORM都很棒,您需要知道为什么要在JDBC之上添加抽象。我可以向你推荐http://www.jooq.org(免责声明:我是jOOQ的创建者,所以这个答案是有偏见的)。 jOOQ采用以下范例:
还有许多其他好的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的原因(以及何时)的几点:
答案 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。