使用組合而不是繼承

Hibernate 有一些繼承策略。JOINED 繼承型別在子實體和父實體之間執行 JOIN。

這種方法的問題是 Hibernate 總是將所有涉及的表的資料帶入繼承中。

例如,如果你有使用 JOINED 繼承型別的實體 BicycleMountainBike

@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 資料。