java - JPA、继承和instanceof

标签 java hibernate oop jpa

我将 JPA 继承与 JOIN 策略 (JPA2/Hibernate) 结合使用。我有一个带有共享字段(日期、时间、地点等)的抽象通用事件实体,以及它的子实体,比如说 OutdoorEvent、ClassicalMusicEvent 等,每种类型都有特定的字段。我搜索所有事件,得到 List<Event>我展示的。虽然每个事件类型的处理是不同的,所以我需要弄清楚每个事件对象的事件类型。现在问题来了。我想出了两个解决方案。首先,instanceof关键词:

if (event instanceof OutdoorEvent) {
   ...
} else if (event instanceof OtherKindOfEvent) {
   ...
} etc.

其次,我将一个 transient 枚举字段添加到事件实体,并在每个子类型的构造函数中设置该字段。然后我可以这样做:

if (event.getType() == EventType.OutdoorEvent) {
   ...
} else if (event.getType() == EventType.OtherKindOfEvent) {
   ...
} etc.

哪个解决方案更好,或者更面向对象?还有其他解决方案吗?

最佳答案

这是一个很好的问题,因为最佳的 OOP 解决方案是使用多态性。在您的抽象事件类上添加一个抽象的“处理”方法,然后在您的子类中实现所需的处理。然后你可以只调用 process() 而不必关心它是什么类型的子类。

但是,您可能希望让您的事件(即数据)类与逻辑分离,因此您可能最终会在某个地方执行 instanceof 或类似您的枚举的操作。

我没有偏好哪个,有可能一个比另一个更快,我可能会使用枚举而不是 instanceof 来提高速度(很想知道是否有人对此有洞察力)。

如果您确实使用枚举在您的事件示例中,您应该使用开关而不是 if..else。

关于java - JPA、继承和instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6303662/

相关文章:

java - 如何正确拆分类(OOP)?

java - 使用 Java 在文件中打印 132000 行

java - 具有不同 JPA 实现的数据库类型的不同映射

java - 无法提取结果集

java - 使用 Javassist 添加字段并更改其值

ios - 自定义 Swift 类中的 CRUD 方法

java - 打印结果 XSSFCell.setCellFormula()

java - JTable使用绑定(bind)​​,如何获取选中的Element?

java - 为什么我的对象没有在 JavaFX 中显示?

java - Hibernate Envers 不使用 SpringMVC 配置在审计表中写入任何内容