ORM 是如何工作的?对象是否序列化为 BLOB?
在 Java 中,JDO 仍然是解决这个问题的方法吗?还有什么可用的?似乎有很多关于 EJB、直接对象序列化和 JDO 的讨论。
为了回答你的第一个问题,这里是Hibernate in Action的摘录,它说有多种方法可以实现 ORM:
纯关系
整个应用程序,包括用户界面,都是围绕关系模型和基于 SQL 的关系操作而设计的。尽管这种方法对于大型系统存在缺陷,但对于可以容忍低级别代码重用的简单应用程序来说,它可能是一个极好的解决方案。直接 SQL 可以在各个方面进行微调,但缺点,例如缺乏可移植性和可维护性,是显着的,特别是从长远来看。这类应用程序经常大量使用存储过程,将一些工作从业务层转移到数据库中。
灯光对象映射
实体表示为手动映射到关系表的类。使用众所周知的设计模式,手工编码的 SQL/JDBC 对业务逻辑隐藏。这种方法非常普遍,并且对于具有少量实体的应用程序或具有通用、元数据驱动的数据模型的应用程序是成功的。存储过程可能在此类应用程序中占有一席之地。
中等对象映射
该应用程序是围绕对象模型设计的。SQL 是在构建时使用代码生成工具生成的,或者在运行时由框架代码生成。对象之间的关联由持久性机制支持,并且可以使用面向对象的表达语言来指定查询。对象由持久层缓存。许多 ORM 产品和自主开发的持久层至少支持这种级别的功能。它非常适合具有一些复杂事务的中型应用程序,特别是当不同数据库产品之间的可移植性很重要时。这些应用程序通常不使用存储过程。
全对象映射
完整的对象映射支持复杂的对象建模:组合、继承、多态性和“可达性持久性”。持久层实现透明持久化;持久类不继承任何特殊的基类,也不必实现特殊的接口。高效的获取策略(惰性和急切获取)和缓存策略对应用程序是透明的。这种级别的功能很难通过自主开发的持久层来实现——它相当于数月或数年的开发时间。许多商业和开源 Java ORM 工具已经达到了这种质量水平。这个级别符合我们在本书中使用的 ORM 的定义。让我们看看我们期望通过一个实现全对象映射的工具来解决的问题。
ORM = 对象关系映射,对象的属性映射到关系数据库中的列。该映射是任意的,因此可以对 blob 进行,实际上最有用的往往是自然映射 - 字符串到 Varchars,int 到整数等。
JPA 是寻找 ORM 标准的地方。JPA 取代了 EJB CMP 方法,该方法被发现很麻烦。JPA 允许您将映射表示为 Java 注释,还允许在配置文件中指定映射,当支持多 [le 数据库时,后者可能很有用。
JPA 有一种查询语言,因此您可以针对对象属性构造查询。
JPA 受到主要 App Server 供应商以及 Hibernate 等产品的支持。
我发现 JPA 非常好用,比 EJB CMP 更好。
我建议仍然使用 EJB 会话 Bean 外观来进行事务管理和安全性 - 基于注释的方法使 EJB 3方式比 EJB 2 更易于使用,最小的编码开销。
JDO其实也是标准的ORM,提供了比JPA(1+2)更完整的规范。JPQL 更侧重于 RDBMS 概念,因此模仿 SQL。JDOQL 遵循 Java 语法,因此更加基于对象。取决于您的应用程序是否曾经被认为远离 RDBMS。如果是这样,那么 JPA 不是要走的路。如果它仅用于 RDBMS,那么 JPA 绝对是一个考虑因素。
对象是否序列化为 BLOB 取决于您的配置。如果您愿意,您可以对复杂的对象类型执行此操作,但它们将不可查询。如果您改为以本机形式保存它们,那么您还可以查询它们,从而产生更高效的应用程序。
--Andy(DataNucleus - JDO 和 JPA 持久性)