【发布时间】:2009-10-16 00:00:15
【问题描述】:
我的问题是关于 ORM 和 JDBC 技术,与 JDBC 和其他方式相比,您决定采用 ORM 技术的标准是什么?
谢谢。
【问题讨论】:
标签: java orm jdbc database-connection
我的问题是关于 ORM 和 JDBC 技术,与 JDBC 和其他方式相比,您决定采用 ORM 技术的标准是什么?
谢谢。
【问题讨论】:
标签: java orm jdbc database-connection
JDBC
休眠。
【讨论】:
复杂性。
ORM如果您的应用程序是域驱动的并且对象之间的关系很复杂,或者您需要让此对象定义应用程序的功能。
JDBC/SQL 如果您的应用程序足够简单,可以直接从数据库中呈现数据,或者它们之间的关系足够简单。
Martin Fowler 的《企业应用程序架构模式》一书更好地解释了这两种类型之间的区别:
【讨论】:
我想你忘了看“函数关系映射”
总结如下:
各种“关系映射”技术的优势在于可移植性:您可以确保您的应用程序可以在大多数 ACID 数据库上运行。 否则,您将在手动编写 SQL 请求时应对各种 SQL 方言之间的差异。
当然你可以限制自己使用 SQL92 标准(然后做一些函数式编程),或者你可以在 ORM 框架中重用函数式编程的一些概念
ORM 的优势是建立在会话对象之上的,会话对象可能会成为瓶颈:
然而,它的优点也是它的缺点:
会话必须能够比较对象,因此您需要实现 equals/hashCode 方法 但是对象相等性必须植根于“业务密钥”而不是数据库 ID(新的瞬态对象没有数据库 ID!)。 但是,一些具体化的概念没有业务平等(例如操作)。 一种常见的解决方法依赖于 GUID,这往往会使数据库管理员感到不安。
会话必须监视关系更改,但其映射规则会推动使用不适合业务算法的集合。 有时您想使用 HashMap 但 ORM 将要求密钥是另一个“富域对象”而不是另一个轻量级对象...... 然后你必须在作为键的富域对象上实现对象相等...... 但是你不能,因为这个对象在商业世界中没有对应物。 所以你回到一个简单的列表,你必须迭代(和性能问题导致)
ORM API 有时不适合实际使用。 例如,现实世界的 Web 应用程序尝试通过在您获取数据时添加一些“WHERE”子句来强制执行会话隔离...... 那么“Session.get(id)”就不够用了,你需要转向更复杂的DSL(HSQL、Criteria API)或者回到原生SQL
数据库对象与专用于其他框架的其他对象发生冲突(例如 OXM 框架 = 对象/XML 映射)。 例如,如果您的 REST 服务使用 jackson 库来序列化业务对象。 但是这个杰克逊正好映射到一个冬眠者。 然后你要么合并两者,你的 API 和数据库之间就会出现强耦合 或者你必须实现一个翻译,你从 ORM 中保存的所有代码都丢失了......
另一方面,FRM 是“对象关系映射”(ORM) 和原生 SQL 查询(使用 JDBC)之间的权衡
解释 FRM 和 ORM 之间差异的最佳方法是采用 DDD 方法。
它释放了对 ORM 会话的约束,并且大部分时间依赖于 SQL 上的 DSL(因此可移植性并不重要) 但另一方面,您必须查看交易细节,并发问题
List<Person> persons = queryFactory.selectFrom(person)
.where(
person.firstName.eq("John"),
person.lastName.eq("Doe"))
.fetch();
【讨论】:
这也取决于学习曲线。
Ebean ORM 的学习曲线非常低(简单的 API、简单的查询语言),如果您对 JPA 映射注释(@Entity、@Table、@OneToMany 等)感到满意。
【讨论】: