在我在博客文章的第一部分中向您介绍了标准 JDBC 作为用于实现持久层的 Java 框架的第一个变体之后,我现在想更详细地介绍 Hibernate 和 JPA。最后,根据“努力”和“绩效”标准对所有三种变体进行比较。
休眠实现
对于使用 Hibernate 的实现,我选择了本文中的“经典”变体:XML 文件中的外包和对象关系映射。这意味着业务类不需要带注解的实体类,并且业务类可以映射到不同的数据库结构。
对于 Hibernate,您需要针对某些数据类型的特殊类来实现数据库表和列 商业房地产的潜在客户 以及属性之间的映射。这些类必须实现 Hibernate UserType 接口。此类用户定义类型的典型示例是枚举(enum)、布尔值(boolean)、国家以及语言(Locale)或货币(Currency)的映射。 Hibernate 不提供这些类型的标准映射。
在我们的示例中,Java 映射中的值被映射到多个数据库列 - 即取决于键。这也需要一个自定义的映射类。因此,每个用户特定类型都需要实现此接口。该接口定义了 11 个方法,实现平均由 40 行代码组成。这些数字包含在一般功能的工作中。
如果每个业务类都有一个默认构造函数,这对 Hibernate 会很有帮助。如果这是不可能或不需要的(例如在我们的示例中),您需要一个实现 Hibernate Interceptor 接口的业务对象工厂类。然后必须在 Hibernate 配置中注册该工厂 (Configuration.setInterceptor())。 Hibernate 已经通过 EmptyInterceptor 类为您提供了该接口的空实现,然后可以对其进行扩展以仅覆盖必要的方法
该类被实现为单例,Hibernate 将映射配置中类定义中指定的名称作为实体名称传递给 instantiate() 方法。通常,这是类的名称和作为 id 的主键。因此,必须创建并返回相应的业务对象,以便定义对象关系映射。为此,每个业务类都需要映射定义中的一个条目
对于每个属性,您需要对应表列的映射规则:
使用 id 元素代替主键的属性。此外,您必须指定密钥的生成器:
对于 1..n 关系,您应该为所使用的容器类和一对多关系定义映射:
与您在 JDBC 中看到的不同,在关系映射定义中定义关系时,lazy="false" 选项不需要任何额外的代码行。
下表包含 Hibernate 实现的工作量。我用一行代码评估了图像定义中的每个 XML 元素。
JPA实施
让我们来看看最后一个 Java 框架变体:JAP。对于 JPA 实现,您首先需要数据传输对象 (DTO) 的实体类,以便可以定义数据库上的映射。如果您还记得的话,这个映射定义与 Hibernate 中的映射定义类似。对于每个业务类(例如数据库表),您需要一个实体类,可以在其中定义属性到表列的映射。在我们的示例中,除了 JPA 所需的标准构造函数之外,我还实现了另一个构造函数来向其传递业务对象。
明智地选择框架——或者说我们一直都是这么做的(第 2 部分)
-
suchona.kani.z
- Posts: 236
- Joined: Sat Dec 21, 2024 5:47 am