请为以下案例提供一些帮助。
我有两张桌子Trips和Location。 Trip实体与Location表有两个@OneToOne
关联。
这将是实体。
@Entity
public class Trip {
@OneToOne
private Location fromLocation;
@OneToOne
private Location toLocation;
....
}
该实体目前通过存储库方法进行水合,例如:
Trip findById(Long id);
一切正常,但问题是每次旅行都会对Location表进行两次调用。有没有办法将此减少为仅一次调用而不更改数据库结构?
我已经尝试在存储库方法的表上使用连接添加本机查询,但由于@OneToOne
注释,调用仍然会发生。删除注释并使用备用存储库方法填充位置也不是一种选择,因为在路上我有一个实体
@OneToMany
private List<Trip> trips = new ArrayList<>();
并且需要相同的治疗。
有什么想法吗?谢谢!
答案 0 :(得分:0)
目前看来,没有。
这是因为你引用了两个不同的对象,由两个不同的PK标识。
您必须编写一个奇怪的自定义查询来查询2个主键,返回两个对象,编写逻辑以分隔fromLocation
和toLocation
个对象,然后将每个对象设置为各自的Trip
中的对象。你可能会考虑更多的开销,而不是让Hibernate运行2个查询并返回整个Trip
对象。
如果您对性能非常担心,我建议为这些对象设置二级缓存。试图在一个自定义查询中检索这两个对象,只是Hibernate自身(相对)有效地完成的事情的不必要的复杂化。