1

我是 JPa / Hibernate 的新手。我们在我们的应用程序中使用 JPA 和休眠。目前我观察到对带有条件的表执行选择查询,休眠对每一行执行选择查询。

所以我的问题是,hibernate 如何对表执行搜索并检索记录?

我有一个场景,我需要查找活动用户并在活动用户列表上执行文件管理器,例如最近登录的用户、最受欢迎的用户(基于某些标准),例如我有 100 个活动用户,其中 20 个用户最近登录。 20 个用户最受欢迎。

如果我必须从数据库中获取记录,当我查询活动用户时,休眠执行 100 次选择操作。(使用表扫描)

如果我对最近和最受欢迎的用户执行 2 个单独的查询,休眠将执行 20 + 20 = 40 次选择操作。(但有 2 次表扫描)

那么hibernate如何从数据库中获取记录呢? 如果我与 jdbc 进行比较,我会说通过获得活跃的音高并对其执行过滤器,我将进行 1 次时间表扫描。

但是使用休眠它会执行更多的选择操作,并且当我为最近和最受欢迎的用户进行个人选择时,它会查询更少的选择,即使我进行了 2 次时间表扫描!

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "fk_profile_id", referencedColumnName = "pk_id")
private Profile Profile;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = InvestmentType.class, orphanRemoval = true)
private List<InvestmentType> investmentType;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = TabDetail.class, orphanRemoval = true)
private List<TabDetail> TabDetail;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "investmentPitch", targetEntity = Address.class, orphanRemoval = true)
private List<Address> Address;

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
@JoinTable(name = "pitch_sector", joinColumns = { @JoinColumn(name = "fk_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "fk_sector_id", nullable = false, updatable = false) })
private List<SectorMaster> sectors;
4

1 回答 1

3

FetchType.EAGER 导致休眠在加载用户后直接加载配置文件。这会触发每个用户的选择。

您可以将其更改为 LAZY。然后只有在您第一次访问配置文件对象时才会触发选择。如果您必须访问每个选定用户的配置文件,这也会导致每个用户都进行选择。为避免这种情况,您可以在一次选择中与用户一起预加载配置文件。有关这方面的详细信息,请参阅以下链接:http ://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-dynamicfetching和http://docs.jboss.org/ hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching

于 2013-05-23T11:20:59.607 回答