2013-03-21 65 views
0

现在,据我所知,有两个最常用的继承映射策略在JPA:在JPA中一次使用两种策略的ORM映射继承?

  1. 单桌 - 在所有类(包括子类和超)在一个表的映射有作为所有类的所有字段列;并且仅在某些子类中特定的字段在其他相应条目中为NULL。

@Entity 
@Table(name="types") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="types", discriminatorType=DiscriminatorType.STRING, length=1) 
public abstract class Base { //... } 

@Entity 
@DiscriminatorValue(value="A") 
public class TypeA extends Base { //... } 

@Entity 
@DiscriminatorValue(value="B") 
public class TypeB extends Base { //... } 
  1. 加入表策略 - ,其中存在对于具有所有基类的字段列和为类型一个其它柱的基类一个表;还有每个子类的特定表,每个子类只有相应的子类的字段与基表一一对应(通过PK)。

@Entity 
@Table(name="USERS") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="types",discriminatorType=STRING, length=1) 
public abstract class Base { //... } 

@Entity 
@Table(name="SELLERS") 
@DiscriminatorValue(value="A") 
@PrimaryKeyJoinColumn(name="base_id") 
public class TypeA extends User { //... } 

@Entity 
@Table(name="BIDDERS") 
@DiscriminatorValue(value="B") 
@PrimaryKeyJoinColumn(name="base_id") 
public class TypeB extends User { //... } 

在我的领域我有这些类:

public abstract class Base { 
//data 
} 

public class TypeA extends Base { 
//only one field 
} 

public class TypeB extends Base { 
// many more fields 
} 

和我想的TypeB和基地之间(类型A和基地和2继承映射策略之间的继承1.映射策略,这是一个过分简单化;实际上有很多实体),因为我不希望另一个表有一个字段。这在JPA中可行吗?它有什么意义吗?

编辑:我不知道什么是错的代码格式...

回答

1

不,这是不可能的JPA。您需要在基类级别配置@Inheritance,并且不能在子类级别覆盖它。

但是,您的选择还包括另一种您没有提及的可能性,即InheritanceType.TABLE_PER_CLASS。如果你使用这个,你会有N个表(对于N个子类),而不是一个或N + 1。在某些情况下,它可以很好地工作,查看链接中的优点/缺点。

+0

我知道买我从OO和关系的角度都没有发现这个好东西。 – m3th0dman 2013-03-21 15:15:59

+0

嗯,我不一定为你推荐'TABLE_PER_CLASS',只是指出它作为一个选项。数据库和编程语言之间的[阻抗不匹配](http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch)将迫使一些权衡。 ORM层简化了其中的一部分,但没有工具会涵盖所有特殊情况,而您的特殊情况是:“我想要一个单独的表,除非它只有几列。” – sharakan 2013-03-21 15:43:17