2011-06-01 33 views
2

現在我正在使用每個子類的表來模擬我的數據。我的層次結構的簡化是:每個子類都有表的Hibernate鑑別器列

abstract class Abstract { 
    /* common data stored in abstract */ 
} 

class ConcreteTypeA1 extends Abstract { 
    /* extra data stored in concrete_type_a_1 */ 
} 

class ConcreteTypeA2 extends Abstract { 
    /* extra data stored in concrete_type_a_2 */ 
} 

class ConcreteTypeB extends Abstract { 
    /* extra data stored in concrete_type_b */ 
} 

所以做了三個外連接,我抓住型摘要的情況下(在現實中,它是十二)。我昨天意識到ConcreteTypeA1和ConcreteTypeA2確實具有相同的額外數據,它們只是行爲不同,所以我想要做的是通過將這兩個類填充到一個表中並使用鑑別器列來減少聯接的數量。我/我可以做到這一點?

class Abstract { 
    /* common data stored in abstract */ 
} 

abstract class ConcreteTypeA extends Abstract { 
    /* extra data stored in abstract_type_a */ 
} 

class ConcreteTypeA1 extends ConcreteTypeA { 
    /* just behavior, no extra data, uses data in abstract_type_a */ 
} 

class ConcreteTypeA2 extends ConcreteTypeA { 
    /* just behavior, no extra data, uses data in abstract_type_a */ 
} 

class ConcreteTypeB extends Abstract { 
    /* extra data stored in concrete_type_b */ 
} 
+2

看到這個答案:http://stackoverflow.com/questions/3915026/how-to-mix-inheritance-strategies-with-jpa-annotations-and-hibernate/3916998#3916998 – 2011-06-01 14:33:55

回答

1

使用這種在父類

@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="type", 
    discriminatorType=DiscriminatorType.STRING) 

,並在混凝土類使用

@DiscriminatorValue("TypeA") 
+0

這個答案缺少在我在Vincents鏈接中找到的ConcreteTypeA中使用@SecondaryTable(table =「abstract_type_a」)和@Column(table =「abstract_type_a」)的重要附加內容。 – 2011-06-01 15:47:47

+0

@RansomBriggs這顯示了「每個類的層次結構」方法;另一種是使用鑑別器列加輔助表的混合方法。 – augurar 2014-11-03 23:43:29

相關問題