gpt4 book ai didi

hibernate - jpa child 尺码表现

转载 作者:行者123 更新时间:2023-12-04 23:59:03 24 4
gpt4 key购买 nike

在我的 Web 应用程序中,我有一个与 Child 具有 OneToMany 关系的对象。
选择我的对象时,我执行以下查询:

from Object o

然后我应该为每个对象打印它有多少个 child
// Foreach
object.children.size()

假设对象有很多 child (比如说 30'000);
调用 size() 或 ORM 框架(在我的情况下为 Hibernate)会在不加载所有子项的情况下处理它是浪费资源吗?

最佳答案

使用 JPA(标准):

  • 您的 @OneToMany 关系默认是延迟加载的(即 fetch=FetchType.LAZY 的默认值)。但是打电话Entity.getCollection().size()会触发延迟加载以检索所有子集合 - 所以是的,它会相当慢,除非您无论如何都需要对所有/大多数元素进行操作。注意:对于 JPA 的所有(理智)实现,这不会发出 30,000 个单独的查询 - 它会发出一个返回结果集中 30,000 行的查询。
  • 如果您需要大多数元素或想提前缓存,请更改为 @OneToMany(fetch=FetchType.EAGER)
  • 在不检索每个对象的情况下获取数据统计信息的常用方法是通过 EntityManager.getQuery()/getTypedQuery()/getNamedQuery() 使用 JPQL。 (甚至 SQL 通过 getNativeQUery() )。这是非常简单且高性能的:

  • int empSize = em.createQuery("SELECT SIZE(d.employees) FROM Department d")     
    .getSingleResult();

    OR ALTERNATIVELY

    // Pre-compiled query placed against entity class for highest performance
    @NamedQueries({
    @NamedQuery(name="Department.EmployeeSize",
    query="SELECT SIZE(d.employees) FROM Department"),
    ... // other named queries
    })
    @Entity
    public class Department {

    ...

    }

    // Then to use the query:
    int empSize = em.createNamedQuery("Department.EmployeeSize", Integer.class)
    .getSingleResult();
  • 您可以启用 2 级缓存。 JPA Caching Summary

    静态配置二级缓存:

  • Map propertiesMap = new HashMap();
    // Valid values are ALL, NONE, ENABLE_SELECTIVE, DISABLE_SELECTIVE
    propertiesMap.add("javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE");
    EntityManagerFactory = Persistence.createEntityManagerFactory("myPUName", propertiesMap);

    ALTERNATIVELY use persistence.xml:

    <persistence-unit name="EmployeeService">
    ...
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

    </persistence-unit>

    然后标记哪些实体应该自动缓存在二级缓存中:
    @Cacheable(true)
    @Entity
    public class Employee {
    ...
    }
  • 还可以动态配置缓存,作为特定查询的一部分

  • 使用专有方法(例如 Hibernate“Extra-Lazy”集合):
  • 与简单地发出 JPQL/SQL 查询相同的性能
  • 保存几行代码(@org.hibernate.annotations.LazyCollection( EXTRA ) annotation v @NamedQuery annotation and execution)
  • 不标准 - 受过 JPA 培训的开发人员不会知道它
  • 不可移植 - 只能与该供应商一起使用。远离专有功能,标准 JPA 成为行业趋势。有许多不同的 JPA 实现。
  • 关于hibernate - jpa child 尺码表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13156856/

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