在我的 Web 应用程序中,我有一个与 Child 具有 OneToMany 关系的对象。选择我的对象时,我执行以下查询:
from Object o
Run Code Online (Sandbox Code Playgroud)
然后我应该为每个对象打印它有多少个孩子
// Foreach
object.children.size()
Run Code Online (Sandbox Code Playgroud)
假设对象有很多孩子(比如说 30'000);调用 size() 或 ORM 框架(在我的情况下为 Hibernate)会在不加载所有子项的情况下处理它是浪费资源吗?
使用 JPA(标准):
Entity.getCollection().size()会触发延迟加载以检索所有子集合 - 所以是的,它会相当慢,除非您无论如何都需要对所有/大多数元素进行操作。注意:对于 JPA 的所有(理智)实现,这不会发出 30,000 个单独的查询 - 它会发出一个返回结果集中 30,000 行的查询。 @OneToMany(fetch=FetchType.EAGER)EntityManager.getQuery()/getTypedQuery()/getNamedQuery()(甚至 SQL via getNativeQUery())。这是非常简单且高性能的: Run Code Online (Sandbox Code Playgroud)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();
Run Code Online (Sandbox Code Playgroud)
您可以启用 2 级缓存。 JPA 缓存摘要
要静态配置 2 级缓存:
Run Code Online (Sandbox Code Playgroud)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>
Run Code Online (Sandbox Code Playgroud)
然后标记哪些实体应该自动缓存在二级缓存中:
@Cacheable(true)
@Entity
public class Employee {
...
}
Run Code Online (Sandbox Code Playgroud)
使用专有方法(例如 Hibernate“Extra-Lazy”集合):
| 归档时间: |
|
| 查看次数: |
3946 次 |
| 最近记录: |