2013-03-21 36 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