我的问题是关于ORM和JDBC技术,与JDBC和其他方式相比,您决定使用ORM技术的标准是什么?
感谢。
答案 0 :(得分:14)
复杂性。
ORM 如果您的应用程序是域驱动的,并且对象之间的关系很复杂,或者您需要使用此对象来定义应用程序的功能。
JDBC / SQL 如果您的应用程序非常简单,只需直接从数据库中显示数据,或者它们之间的关系非常简单。
Martin Fowler撰写的“企业应用程序架构模式”一书更好地解释了这两种类型之间的差异:
答案 1 :(得分:12)
JDBC
冬眠。
答案 2 :(得分:2)
我想你忘了查看"功能关系映射"
我总结说:
各种"关系映射的强度"技术是可移植性:您确保您的应用程序将在大多数ACID数据库上运行。 否则,当您手动编写SQL请求时,您将处理各种SQL方言之间的差异。
当然你可以限制自己使用SQL92标准(然后做一些函数式编程),或者你可以重用ORM框架的一些函数式编程概念
ORM强项建立在会话对象上,可以作为瓶颈:
然而,它的优点也是它的弱点:
会话必须能够比较对象,因此您需要实现equals / hashCode方法 但是对象的平等必须植根于" Business Keys"而不是数据库ID(新的临时对象没有数据库ID!)。 但是,一些具体化的概念没有业务相等(例如操作)。 常见的解决方法依赖于可能会扰乱数据库管理员的GUID。
会话必须间谍关系更改,但其映射规则会推动使用不适合业务算法的集合。 有时候你想使用HashMap,但是ORM会要求密钥成为另一个" Rich Domain Object"而不是另一个轻... 然后,您必须在富域域对象上实现对象相等作为键... 但是你不能因为这个对象在商业世界中没有对应物。 所以你回到一个你必须迭代的简单列表(并且产生性能问题)
ORM API有时不适合实际使用。 例如,真实世界的Web应用程序试图通过添加一些" WHERE"来强制执行会话隔离。获取数据时的子句... 那么" Session.get(id)"不够,你需要转向更复杂的DSL(HSQL,Criteria API)或回到原生SQL
数据库对象与专用于其他框架的其他对象(如OXM frameworks = Object / XML Mapping)冲突。 例如,如果您的REST服务使用jackson库来序列化业务对象。 但是这个杰克逊完全映射到了一个Hibernate One。 然后你要么合并它们,你的API和你的数据库之间会出现强大的耦合 或者你必须实现一个翻译,你从ORM保存的所有代码都会丢失......
另一方面,FRM是对象关系映射"对象关系映射"之间的权衡。 (ORM)和本机SQL查询(使用JDBC)
解释FRM和ORM之间差异的最佳方法是采用DDD方法。
它释放了对ORM会话的约束,并且大部分时间都依赖于SQL上的DSL(因此可移植性并不重要) 但另一方面,您必须查看事务详细信息,并发问题
列出人物= queryFactory.selectFrom(人物) 。哪里( person.firstName.eq("约翰&#34), person.lastName.eq(" Doe的&#34)) .fetch();
答案 3 :(得分:1)
这还取决于学习曲线。
如果您对使用JPA注释进行映射(@ Entity,@ Table,@ OneToMany等)感到满意,那么Ebean ORM的学习曲线非常低(简单的API,简单的查询语言)。