我有以下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的產生這個鑑別列以提高性能?
FWIW我敢肯定DataNucleus將JPA會產生在這種情況下鑑別列,因爲你確實需要申請一個時間。 – DataNucleus
實體是否總是具有與父類相同類型的實體?例如,一個Scl的父母是否總是一個Scl? –