2011-09-06 56 views
1

以下是JPA註釋類型層次結構,其中所有數據字段(以及關聯的getter和setters)都是超類型的成員,以及用於實現業務邏輯的抽象方法。有許多子類型在不添加數據成員的情況下實現這些抽象方法,因此我們使用單表繼承策略,以便我們只需要數據庫中的一個表來支持此類型層次結構。JPA/Hibernate:子類型與策略'模式'

我這樣做是因爲根據數據的內容,必須實現不同的行爲才能實現最終目標。

@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中鑑別器列概念的顛覆嗎?

一位同事認爲,由於數據的結構並不因子類型而異,因此抽象方法和相應的實現應該被移入類似策略模式的方法。他的觀念更好嗎?

回答

1

更好是非常主觀的。這聽起來像組合和策略是一個有效的選擇,這可能會阻止您需要爲業務邏輯的每個實現映射另一個實體。

JPA和hibernate放在一邊,我讀過的每一本OO設計書都以分享行爲的「偏好構成而不是繼承」開始。

假設你有一個數據對象,你不能在每個非休眠策略之間共享這個對象並對它進行操作嗎?無論如何,擁有更少的JPA/Hibernate更容易。

+0

我曾看過使用組合,但它使服務層中的某些事情有點混亂。但是,我想我同意你和我的同事越來越多地認爲我上面的遺傳方案並不是很好。我會在作文方面多做一些工作 - 謝謝你的回答。 – simpleton