使用组合而不是继承

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 数据。