ORM 如何在幕后工作?另外,在 Java 中拥有持久对象的最佳方法是啥?

Posted

技术标签:

【中文标题】ORM 如何在幕后工作?另外,在 Java 中拥有持久对象的最佳方法是啥?【英文标题】:How does ORM work under the covers? Also what is the best way to have persistent objects in Java?ORM 如何在幕后工作?另外,在 Java 中拥有持久对象的最佳方法是什么? 【发布时间】:2010-11-16 21:46:52 【问题描述】:

ORM 是如何工作的?对象是否序列化为 BLOB?

在 Java 中,JDO 仍然是解决这个问题的方法吗?还有什么可用的?似乎有很多关于 EJB、直接对象序列化和 JDO 的讨论。

【问题讨论】:

Hibernate in Action 这本书对对象关系映射有很好的介绍 【参考方案1】:

为了回答你的第一个问题,这里是来自Hibernate in Action 的摘录,它说有多种方法可以实现 ORM:

纯关系

整个应用程序,包括 用户界面,是围绕 关系模型和基于 SQL 的 关系操作。这种方法, 尽管它的不足之处在于大 系统,可以是一个很好的解决方案 对于简单的应用程序,其中低 代码重用水平是可以容忍的。 直接 SQL 可以在每个 方面,但缺点,如 缺乏便携性和 可维护性,很重要, 特别是从长远来看。 此类别中的应用程序通常 大量使用存储过程, 将部分工作移出 业务层并入数据库。

灯光对象映射

实体表示为类 手动映射到 关系表。手工编码的 SQL/JDBC 隐藏在业务逻辑之外 使用众所周知的设计模式。 这种方法非常普遍 并且申请成功 与少数实体,或 具有通用性的应用程序, 元数据驱动的数据模型。已存储 程序可能在其中占有一席之地 种应用。

中型对象映射

该应用程序是围绕一个 对象模型。 SQL 生成于 使用代码生成构建时间 工具,或在运行时通过框架代码。 对象之间的关联是 坚持不懈的支持 机制,并且查询可能是 使用面向对象指定 表达语言。对象是 由持久层缓存。一种 很多 ORM 产品和本土产品 持久层至少支持 这个级别的功能。很好 适用于中型应用 通过一些复杂的交易, 特别是当之间的便携性 不同的数据库产品是 重要的。这些应用程序通常 不要使用存储过程。

完整的对象映射

完整的对象映射支持 复杂的对象建模: 组合、继承、 多态性和“持久性 可达性。”持久层 实现透明持久化; 持久类不继承任何 特殊基类或必须 实现一个特殊的接口。 高效的抓取策略(懒惰 和渴望获取)和缓存 实施战略 对应用程序透明。这 功能水平几乎不可能 通过本土的坚持实现 层——相当于几个月或 年的发展时间。一个号码 商业和开源 Java ORM 工具已经达到了这个水平 质量。这个水平符合 我们在这里使用的 ORM 的定义 书。看看我们遇到的问题 期望通过一个工具来解决 实现全对象映射。

【讨论】:

您是否知道哪种 ORM 最适合以下语言/平台? Python/Django C#/ASP.NET MVC Java/Google Web 工具包【参考方案2】:

ORM = 对象关系映射,对象的属性映射到关系数据库中的列。该映射是任意的,因此可以对 blob 进行,实际上最有用的往往是自然映射 - 字符串到 Varchars,int 到整数等。

JPA 是寻找 ORM 标准的地方。 JPA 取代了 EJB CMP 方法,该方法被发现很麻烦。 JPA 允许您将映射表示为 Java 注释,还允许在配置文件中指定映射,当支持多 [le 数据库时,后者可能很有用。

JPA 有一种查询语言,因此您可以针对对象属性构造查询。

主要的 App Server 供应商以及 Hibernate 等产品都支持 JPA。

我发现 JPA 非常好用,比 EJB CMP 更好。

我建议仍然使用 EJB 会话 Bean 外观来进行事务管理和安全性 - 基于注释的方法使得 EJB 3 比 EJB 2 更易于使用,方式,最小的编码开销。

【讨论】:

所以我可以根据提交到数据库的类的成员变量进行查询?【参考方案3】:

JDO 实际上也是标准的 ORM,并且提供了比 JPA (1 + 2) 更完整的规范。 JPQL 更侧重于 RDBMS 概念,因此模仿 SQL。 JDOQL 遵循 Java 语法,因此更加基于对象。取决于您的应用程序是否曾经被认为远离 RDBMS。如果是这样,那么 JPA 不是要走的路。如果它仅用于 RDBMS,那么 JPA 绝对是一个考虑因素。

对象是否被序列化为 BLOB 取决于您的配置。如果您愿意,您可以对复杂的对象类型执行此操作,但它们将不可查询。如果您改为以原生形式保存它们,那么您也可以查询它们,从而产生更高效的应用程序。

--Andy (DataNucleus - JDO 和 JPA 持久化)

【讨论】:

以上是关于ORM 如何在幕后工作?另外,在 Java 中拥有持久对象的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 分析如何“在幕后”工作?

这个递归数组置换函数如何在幕后工作?

C ++如何在幕后工作[重复]

Vue.js 反应性如何在幕后工作?

CSS如何在幕后工作?

GCP“管理元数据中的 SSH 密钥”如何在幕后工作 [关闭]