gpt4 book ai didi

postgresql - 如何强制 Hibernate 使用连接来获取实例的数据

转载 作者:行者123 更新时间:2023-12-04 15:07:40 27 4
gpt4 key购买 nike

我有一个使用 Hibernate 作为 JPA 提供程序的 Spring Boot 应用程序。我的应用程序有两个实体连接到 @OneToMany/@ManyToOne关系。关系用 @Fetch(FetchMode.JOIN) 注释在两个方向上,以及 fetch = FetchType.EAGER .
我的实体被称为 CarDriver :

@Entity
@Table(name = "car")
@Data
public class Car implements Serializable, Cloneable {
@Id
@GenericGenerator(name = "car_seq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
@Parameter(name = "sequence_name", value = "car_seq") })
@GeneratedValue(generator = "car_seq")
private Integer id;

@OneToMany(mappedBy = "car", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
private List<Driver> drivers = new ArrayList<>();

@Column(name = "license_no", nullable = false)
private String licenseNo;
}

@Entity
@Table(name = "driver")
@Data
public class Driver implements Serializable, Cloneable {
@Id
@GenericGenerator(name = "driver_seq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
@Parameter(name = "sequence_name", value = "driver_seq") })
@GeneratedValue(generator = "driver_seq")
private Integer id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "car_id", nullable = true)
@Fetch(FetchMode.JOIN)
private Car car;

@Column(name = "name", nullable = false)
private String name;
}
When selecting a care (e.g. by calling Car.findById() ), Hibernate joins the the two tables in a single SQL, and returns a Car具有 Drivers 列表的对象.
但是如果我选择单个驱动程序,Hibernate 将加入 DriverCar表给我 Driver对象与 Car属性已填充,但它将运行第二个查询以获取汽车对象列表中的所有驱动程序对象。
出于性能原因,我希望在单个查询中获取所有涉及的对象,就像我获取汽车时的情况一样。但是我找不到让 Hibernate 这样做的方法。有属性(property), hibernate.max_fetch_depth ,应该这样做,但我发现它只影响取车的行为,而不影响取车时的行为。
我知道我可以使用 EntityGraph控制获取,并使用 EntityGraph我已经在一次查询中成功检索到了一个驱动程序对象及其汽车和所有汽车的驱动程序。但是要做到这一点,我必须在检索对象时明确使用图形,并且在 Car 的所有各种情况下我都不能这样做。需要的对象。还有很多其他实体与 Car 有关系。 ,而且我不想写 EntityGraph对于每一个。
那么有没有办法告诉 Hibernate 您希望如何在实体上默认完成提取?我本来认为注释就足够了,但似乎必须有更多的东西,或者这根本无法完成。
阿恩特

最佳答案

FetchType.EAGER是导致性能问题的最常见原因之一。你应该使用

@OneToMany(mappedBy = "car")
private List<Driver> drivers = new ArrayList<>();
并获取驱动程序如果需要 SELECT c FROM Car c JOIN FETCH c.drivers

关于postgresql - 如何强制 Hibernate 使用连接来获取实例的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65775651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com