在集合的每个对象中强制初始化延迟加载字段的好方法是什么?
此时我唯一想到的是使用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();
通过这种方式,您可以为每个不同的用例定义特定的获取行为。
另请参阅:
- http://www.thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/
- https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs001.htm
顺便说一句:据我所知,大多数 JPA 提供程序都会执行 @XXXtoOne
关系的预先加载,即使您将映射定义为惰性映射。 JPA 规范确实允许这种行为,因为延迟加载始终只是暗示数据可能会或可能不会立即加载。另一方面,急切加载必须立即执行。
关于java - JPA 具有延迟加载字段的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39115438/