2011-06-01 31 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

相关问题