【发布时间】:2020-09-13 05:00:21
【问题描述】:
我创建了一对一的关系,我希望有一些方法可以获取相同的实体(Distributor.class),但一个是惰性获取,另一个是急切的。
@Entity
@Table
public class Distributor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String site;
@OneToOne(
mappedBy = "distributor",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY,
optional = false
)
private Location location;
public void setLocation(Location repositoryLocation) {
if (repositoryLocation == null) {
if (this.location != null) {
this.location.setDataProvider(null);
}
}
else {
repositoryLocation.setDataProvider(this);
}
this.location = repositoryLocation;
}
// getters/setters/constructor
}
}
@Entity
@Table(name = "location")
public class Location {
@Id
private Long id;
@Column(name = "country_code")
private String countryCode;
private Double longitude;
private Double latitude;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "id")
private Distributor distributor;
public Distributor getDistributor() {
return distributor;
}
public void setDistributor(Distributor distributor) {
this.distributor = distributor;
}
// other getters/setters
}
我遇到的最大问题是 Spring Data JPA 似乎忽略了 FetchType 并急切地获取所有相关表(基于 related threads 和 Spring Data JPA 文档)。所有使用 Distributor.class 获取数据的 Spring Data Repository 方法都在两个选择中急切地从 Distributor 和 Location 中获取 Location。 通过这样使用@NamedEntityGraph:
@Entity
@Table
@NamedEntityGraph(
name = "distributor-entity-graph",
attributeNodes = {
@NamedAttributeNode("location"),
}
)
public class Distributor {
//spring data jpa methods
@EntityGraph(value = "distributor-entity-graph", type = EntityGraph.EntityGraphType.LOAD)
Optional<Distributor> findById(Long id);
如果使用这样的图表,我会在 Location 上获得单个左外连接,尽管它是一种更好的急切负载类型,但这仍然是急切负载。
到目前为止,我 have found 所做的一切似乎都是糟糕的解决方法。
是否有一些或多或少的巧妙方法可以做到这一点,或者是否更好(首先在性能方面)只是不创建关系并按需获取Location?急切的负载是一种气味,但是当我获取单个分发服务器时,在大多数情况下我都想这样做,但在某些情况下我不这样做,尤其是如果我这样做了 findAll()。
【问题讨论】:
-
你用的是什么休眠版本?
-
在这个测试环境中,我使用最新的 Spring 版本 2.3.0.RELEASE,它使用 hibernate v.5.4.15.Final(一切都在测试环境中测试),在 prod hibernate v.5.2.17决赛(早春)。
标签: spring hibernate jpa spring-data-jpa