2012-09-01 47 views
0

我有以下JPA映射。TABLE_PER_CLASS的鑑別器

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
@DiscriminatorColumn 
public class BaseEntity implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private Long pk; 
    @ManyToOne(fetch = FetchType.LAZY) 
    private BaseEntity parent; 
} 

@Entity 
@Table(name="sclBase") 
@DiscriminatorValue("sclBase") 
public class SclBase extends BaseEntity { 
    private String attr; 
} 

@Entity 
@Table(name="scls") 
@DiscriminatorValue("scls") 
public class Scls extends BaseEntity { 
    private String attr; 
} 

@Entity 
@Table(name="scl") 
@DiscriminatorValue("scl") 
public class Scl extends BaseEntity { 
    private String attr; 
} 

因此,每個實體在編譯時可能有一個不知道類型的父類。由於使用了table_per_class層次結構,因此不會生成BaseEntity表,但其屬性將在每個子類中重複。所以每個子類都有以​​下字段:pk - 主鍵,attr - 某個屬性,parent_id - 對父項的引用。但是,父母標識不會是外鍵,因爲我們不知道它引用了哪個表。

所以,當我想獲得該實體的Hibernate/EclipseLink的會遍歷所有實體,直到它找到與給定PARENT_ID實體的母公司。不是很有效,不是嗎?如果將parent_type存儲爲鑑別器列,該過程可能會更簡單。所以父母可以通過父母類型和parent_id找到。

有沒有一種方法,使休眠/ EclipseLink的產生這個鑑別列以提高性能?

+0

FWIW我敢肯定DataNucleus將JPA會產生在這種情況下鑑別列,因爲你確實需要申請一個時間。 – DataNucleus

+0

實體是否總是具有與父類相同類型的實體?例如,一個Scl的父母是否總是一個Scl? –

回答