openxava / 文档 / 第六章:映射式超类继承

课程:1. 入门教学 | 2. 基本域模型(上) | 3. 基本域模型(下) | 4. 优化用户界面 | 5. 敏捷开发 | 6. 映射式超类继承 | 7. 实体继承 | 8. 视图继承(View) | 9. Java 属性 | 10. 计算属性 | 11. 用在集合的 @DefaultValueCalculator | 12. @Calculation 和集合总计 | 13. 从外部文件的 @DefaultValueCalculator | 14. 手动更改 schema | 15. 多用户时默认值的计算 | 16. 同步持久属性和计算属性 | 17. 从数据库中的逻辑 | 18. 使用 @EntityValidator 进行验证 | 19. 验证替代方案 | 20. 删除时验证 | 21. 自定义 Bean Validation 注解 | 22. 在验证中调用 REST 服务 | 23. 注解中的属性 | 24. 改进标准行为 | 25. 行为与业务逻辑 | 26. 参照与集合 | A. Architecture & philosophy | B. Java Persistence API | C. Annotations | D. Automated testing

目录

第六章:映射式超类继承
映射超类
简化您的实体
总结
继承是在面向对象中重用代码的一种实用方法。在 JPA 和 OpenXava 中使用继承就像在纯 Java 中使用它一样简单。我们将使用继承来删除重复的代码,例如 UUID,我们将使用 JPA 映射式超类来完成。


映射超类

Author、Category 和 Invoice 类有重复的代码,這就是 oid 字段:
@Id @GeneratedValue(generator="system-uuid") @Hidden
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(length=32)
String oid;
这这段代码在以上三类都是一样的。您也知道复制和粘贴是一种致命的罪过,所以我们必须寻找一个解决方案来消除重复的代码,以避免我们走向地狱。
一个优雅的解决方案是通过继承。 JPA 允许很多继承的方法。其中之一个是从映射的超类继承。映射超类是具有 JPA 映射注解的 Java 类,但它并不是实体。它的唯一目标是用作实体的超类。我来现在来使用它,您会很快看到它的实用性。
首先,我们将这段重复的代码移动到注解为@MappedSuperclass 的类中。我们将其命名为 identifiable:
package com.yourcompany.invoicing.model;
 
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import org.openxava.annotations.*;
import lombok.*;
 
@MappedSuperclass // 表示它是映射式超类而不是实体
@Getter @Setter
public class Identifiable {
 
    @Id @GeneratedValue(generator="system-uuid") @Hidden
    @GenericGenerator(name="system-uuid", strategy = "uuid")
    @Column(length=32)
    String oid; // 属性有包括 OpenXava 和 JPA 的注解
 
}

简化您的实体

现在您可以以更简洁的方式定义作者、类别和发票实体。例如,这是 Category 新代码:
package com.yourcompany.invoicing.model;
 
import javax.persistence.*;
import lombok.*;
 
@Entity @Getter @Setter
public class Category extends Identifiable { //从 identifiable 继承而来,所以不须要 id 这个属性
  
    @Column(length=50)
    String description;
 
}
重构非常简单, Category 现在从 Identifiable 继承而来,并删除了 oid 属性。这样,您的代码不仅更短也更优雅,因为您声明该类是 identifiable 可识别的(是什么,而不是如何),并且您从业务逻辑类中删除了一些技术性的代码。
将相同的重构应用于 Author 和 Invoice 实体。此外,从现在开始,大多实体将从映射超类 Identifiable 继承。

我们创建了 Identifiable 类来了解使用映射超类的好处,不过 OpenXava 为您准备了一个可以使用的 Identifiable 类,在 org.openxava.model 包中可以找到。因此,在您的下一个项目中,您不需要再次编写 Identifiable 类,只需使用 OpenXava 自带的即可。

总结

您学到映射式超类是具有 JPA 映射注解的普通类,您可以将其用作实体的基本类。此外,您还学习了如何使用映射式超类来简化代码。

下载本课源代码

对这节课有什么问题吗? 前往论譠 一切都顺利吗? 前往第七章