Hibernate ORM

什么是对象关系映射?

如果您已经熟悉 Java、对象关系映射和对象关系不匹配,您可能想直接跳到 Hibernate ORM 优势 讨论

持久化

Hibernate ORM 专注于帮助您的应用程序实现持久化。那么什么是持久化?持久化意味着我们希望应用程序的数据在应用程序进程结束之后仍然存在。用 Java 术语来说,我们希望(部分)对象的狀態在 JVM 范围之外仍然存在,以便稍后可以访问相同的狀態。

关系型数据库

具体来说,Hibernate ORM 专注于数据持久化,因为它适用于 关系型数据库 (RDBMS)。在面向对象应用程序的世界中,经常会讨论使用 对象数据库 (ODBMS) 而不是 RDBMS。我们在这里不会探讨这种讨论。需要说明的是,RDBMS 仍然是一种非常流行的持久化机制,并且在可预见的未来将会继续如此。

对象关系阻抗不匹配

“对象关系阻抗失配”(有时称为“范式失配”)只是说对象模型和关系模型不能很好地协同工作的一种花哨的说法。关系型数据库管理系统(RDBMS)以表格形式表示数据(对于不熟悉 RDBMS 的人来说,电子表格是一个很好的可视化方式),而面向对象的语言(如 Java)则将其表示为一个相互关联的对象图。使用表格关系型数据库加载和存储对象图会暴露我们面临的 5 个失配问题…​

粒度

有时您的对象模型中的类数会超过数据库中对应表格的数量(我们说对象模型的粒度比关系模型的粒度更细)。例如,考虑地址的概念…​

子类型(继承)

继承是面向对象编程语言中的一种自然范式。然而,RDBMS 并没有定义任何类似的东西(是的,一些数据库确实支持子类型,但它完全是非标准化的)…​

标识

RDBMS 定义了唯一的“相同性”概念:主键。然而,Java 同时定义了对象标识 a==b 和对象相等性 a.equals(b)

关联

关联在面向对象语言中表示为单向引用,而 RDBMS 使用外键的概念。如果您需要在 Java 中使用双向关系,则必须定义两次关联。

同样,您无法通过查看对象域模型来确定关系的多重性。

数据导航

您在 Java 中访问数据的方式与在关系型数据库中访问数据的方式 fundamentally 不同。在 Java 中,您通过遍历对象网络从一个关联导航到另一个关联。

这不是从关系型数据库中检索数据的有效方法。您通常希望将 SQL 查询的数量降至最低,因此通过 JOIN 加载多个实体并选择目标实体,然后再开始遍历对象网络。

返回顶部