如何避免在实体的休眠条件中初始化Eager列

多个实体与@OnetoMany关系关联,并且Eager加载有实体。 在使用Hibernate标准获取数据时,相关的Eager列已初始化,这对我的项目造成了性能问题,因为它庞大且有许多Eager加载的关系。

在使用休眠条件来获取数据时避免初始化Eager列的最佳方法是什么?

daocao1020 回答:如何避免在实体的休眠条件中初始化Eager列

如果您使用@O​​neToMany批注,则有一个名为fetch = FetchType.LAZY的属性。

您可以使用它。它将通知休眠休眠加载。 有关更多信息,您可以访问Baeldung.com并搜索Eager and Lazy Loading

,

我也建议Mayuree提到相同的内容。进一步了解您是否可以在以下条件下玩游戏:

  • 减小批量大小也可以帮助解决问题,以便分页可以帮助您解决问题。
  • 这将增加启动时间,但Db性能的折衷是巨大的。您可以急切地加载所需的必要表。

Source

,

我建议使用fetch = FetchType.LAZY,但是您必须检查事务代码。如果创建了它们,那就很好了,否则尝试使用该数据时会出现LazyInitializationException。

如果您不希望每次获取父实体时都急切地获取它,则有两种解决方案而不更改旧代码。第一个是创建实体图并将其包括在图中。因此,您将使用图形获取数据,仅此而已。不再需要其他SQL查询来获取渴望的集合。第二种解决方案是为同一张表创建实体,但将所有内容标记为惰性。

,

您使用哪个JPA版本? JPA 2.1引入了Dynamic fetching via JPA entity graph 或者您可能尝试使用Dynamic fetching via Hibernate profile

引用https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/fetching/Fetching

https://docs.jboss.org/hibernate/orm/5.0/userguide/en-US/html/ch09.html

,

您可以使用投影。如果您使用的是Spring Data,则其中包含一些不错的帮助器,请参见Baeldung: Spring Data JPA ProjectionsSpring Data JPA Reference了解详细信息。如果直接使用Hibernate,请参见Baeldung: JPA/Hibernate ProjectionHibernate JavaDoc Projection

休眠(直接来自Baeldung的报价)

要使用JPQL在多个列上进行投影,我们只需要将所有必需的列添加到select子句中即可:

Query query = session.createQuery("select id,name,unitPrice from Product"); List resultList = query.getResultList();

但是,当使用CriteriaBuilder时,我们必须做一些不同的事情:

CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); Root product = query.from(Product.class); query.multiselect(product.get("id"),product.get("name"),product.get("unitPrice")); List<Object[]> resultList = entityManager.createQuery(query).getResultList(); 在这里,我们使用了multiselect()方法而不是select()。使用这种方法,我们可以指定多个要选择的项目。

另一个重要的变化是Object []的使用。当我们选择多个项目时,查询将返回一个对象数组,其中包含每个投影项目的值。 JPQL也是如此。

让我们看看打印数据时的样子:

[1,产品名称1,1.40] [2,产品名称2,4.30] [3,产品名称3,14.00] [4,产品名称4,3.90] 如我们所见,返回的数据处理起来有点麻烦。但是,幸运的是,我们可以让JPA将这些数据填充到自定义类中。

此外,我们可以使用CriteriaBuilder.tuple()或CriteriaBuilder.construct()分别以Tuple对象或自定义类对象的列表的形式获取结果。

我建议您阅读Baeldung文章,它会更详细。

,

您可以使用在懒惰模式下获取的条件来显式定义属性。

criteria.setFetchMode("property_name",FetchMode.SELECT); 

在休眠代码中,SELECT是惰性的。

public static final FetchMode LAZY = SELECT;

休眠文档链接

https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-dynamicfetching

本文链接:https://www.f2er.com/3119440.html

大家都在问