java - JPA 具有延迟加载字段的对象集合

标签 java jpa

在集合的每个对象中强制初始化延迟加载字段的好方法是什么?

此时我唯一想到的是使用foreach循环来迭代槽集合并调用该字段的getter,但它不是很有效。集合甚至可以有 1k 个对象,在这种情况下,每次迭代都会触发到数据库。

我无法更改从数据库获取对象的方式。

代码示例。

public class TransactionData{

@ManyToOne(fetch = FetchType.LAZY)
private CustomerData customer;
...
}

List<TransactionData> transactions = getTransactions();

最佳答案

您可以定义实体图来覆盖默认的获取类型,因为它们是在映射中定义的。

请参阅下面的示例

@Entity
@NamedEntityGraph(
    name = "Person.addresses", 
    attributeNodes = @NamedAttributeNode("addresses")
)
public class Person {
    ...
    @OneToMany(fetch = FetchType.LAZY) // default fetch type
    private List<Address> addresses;
    ...
}

在以下查询中,现在将立即加载地址。

EntityGraph entityGraph = entityManager.getEntityGraph("Person.addresses");
TypedQuery<Person> query = entityManager.createNamedQuery("Person.findAll", Person.class);
query.setHint("javax.persistence.loadgraph", entityGraph);
List<Person> persons = query.getResultList();

通过这种方式,您可以为每个不同的用例定义特定的获取行为。

另请参阅:

顺便说一句:据我所知,大多数 JPA 提供程序都会执行 @XXXtoOne 关系的预先加载,即使您将映射定义为惰性映射。 JPA 规范确实允许这种行为,因为延迟加载始终只是暗示数据可能会或可能不会立即加载。另一方面,急切加载必须立即执行。

关于java - JPA 具有延迟加载字段的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39115438/

相关文章:

java - 在用户定义的 LinkedList 中创建 push 和 pop 方法

java - 如何使用非 Lambda 函数定义 Spark RDD 转换

javascript - JS/html游戏转Android应用程序而不使用webview

java - 当将 OrderColumn 与两个列表一起使用时,Hibernate 会抛出 "Repeated column in mapping for entity"

hibernate - 如何使用 JPA 在表中查找值

java - 将列映射到映射 hibernate

java - Hibernate 级联引用约束冲突

jdk 1.3 中的 Java 拆分

java - 显示格式XX :00 in JAVA

java - 来自一对多关系的实体仅在应用程序重启后可见(JPA 和 PostgreSQL)