使用組合而不是繼承
Hibernate 有一些繼承策略。JOINED
繼承型別在子實體和父實體之間執行 JOIN。
這種方法的問題是 Hibernate 總是將所有涉及的表的資料帶入繼承中。
例如,如果你有使用 JOINED
繼承型別的實體 Bicycle
和 MountainBike
:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
和:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
任何打到 MountainBike
的 JPQL 查詢都會帶來 Bicycle
資料,建立一個 SQL 查詢,如:
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
如果你有另一個 Bicycle
的父級(比如 Transport
,每個例子),上面的查詢也會帶來這個父級的資料,做一個額外的 JOIN。
如你所見,這也是一種 EAGER
對映。你無法使用此繼承策略僅選擇 MountainBike
表的資料。
效能最好的是使用組合而不是繼承。
要實現此目的,你可以將 MountainBike
實體對映到具有欄位 bicycle
:
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
而 Bicycle
:
@Entity
public class Bicycle {
}
現在每個查詢預設只會帶來 MountainBike
資料。