使用组合而不是继承
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
数据。