【问题标题】:JPA/Hibernate: Sub-typing vs. strategy 'pattern'JPA/Hibernate:子类型与策略“模式”
【发布时间】:2011-09-06 03:00:05
【问题描述】:

以下是 JPA 注释的类型层次结构,其中所有数据字段(以及相关的 getter 和 setter)都是超类型的成员以及用于实现业务逻辑的抽象方法。有许多子类型在不添加数据成员的情况下实现这些抽象方法,因此我们使用单表继承策略,因此我们只需要数据库中的一个表来支持这种类型层次结构。

我这样做是因为,根据数据的内容,必须实施不同的行为才能实现最终目标。

@Entity
@Table
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class SuperEntity {
  // Several fields and getters and setters
  ...
  // Abstract method declarations for business logic
  ...
}

@Entity
@DiscriminatorValue("some value")
public class SomeSubtype extends SuperEntity {
  // Implementations of abstract methods
  ...
}

这是对 JPA/Hibernate 中鉴别器列概念的一种变态吗?

一位同事争辩说,由于数据的结构不会因子类型而异,因此抽象方法和相应的实现应该转移到类似于策略模式的方法中。他的想法更好吗?

【问题讨论】:

    标签: java hibernate jpa domain-model anemic-domain-model


    【解决方案1】:

    更好是非常主观的。听起来组合和策略是一种有效的替代方案,这可能会阻止您为业务逻辑的每个实现映射另一个实体。

    除了 JPA 和 hibernate,我读过的每一本 OO 设计书籍都是从“优先组合优于继承”开始的,用于共享行为。

    假设您有一个数据对象,您不能在每个非休眠策略之间共享该对象并对其进行操作吗?无论如何,更少的 JPA/hibernate 对眼睛来说更容易。

    【讨论】:

    • 我曾研究过使用组合,但它会使服务层中的某些事情变得有些混乱。但是,我想我越来越同意你和我的同事的观点,即我上面的继承方案并不好。我会在组合方法上多做一些工作——谢谢你的回答。
    猜你喜欢
    • 2021-02-23
    • 2015-06-18
    • 2016-12-13
    • 1970-01-01
    • 2018-07-02
    • 2019-01-06
    • 2011-08-17
    • 2020-08-09
    相关资源
    最近更新 更多