java - 使用 entitymanager 急切加载集合

标签 java ejb entitymanager

我有一个实体(联系人),它有一个延迟加载的集合。我不想改变它,但我需要在执行 em.find(Contact.class, myID) 时加载集合,这是否可以在不更改实体且不使用 jpql 语句和 fetch 的情况下完成。 ?

public class Contact implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id 
    @Column(name="contactId", nullable=false)
    public String contactId;    

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "contact", orphanRemoval = true, fetch=FetchType.LAZY)
    private List<ContactTaskRelation> taskRelations = new ArrayList<ContactTaskRelation>();

}

来 self 的无状态bean

@PersistenceContext(unitName="myContext")
private EntityManager em;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private Contact getContact(ContactMapping mappedContact){
    //force em to load the collection of taskRelations
    return em.find(Contact .class, mappedContact.getContact());
}

最佳答案

Contact entity = em.find(Contact.class, mappedContact.getContact());
entity.getTaskRelations().size(); // this will fetch the TaskRelations
return entity;

缺点是这会对数据库进行两次查询:一次获取联系人,另一次获取任务关系。

另一种选择是进行查询,如下所示:

String queryString = "SELECT model FORM Contact model JOIN FETCH model.taskRelations WHERE model.id = :id";
Query query = em.createQuery(queryString);
query.setParameter("id", mappedContact.getContact());
return query.getSingleResult(); // or getResultList();

此选项只进行一次查询。

关于java - 使用 entitymanager 急切加载集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216546/

相关文章:

java - Google BigQuery 不稳定,几乎所有表查询都执行查询失败 : "Error: Error preparing subsidiary query: null"

java - 模拟恒星的引力?

java - 如何在我的 Maven 项目中更改 ejb-jar.xml 的位置?

ejb - 如何获取所有 EJB 计时器?

JavaEE : Does EntityManager get method changing state in DB

java - Log4j - 让多个 appender 写入同一个文件,其中一个始终记录

java - 我不明白包装类和自动装箱?

java - 如何在 JBOSS 7 EJB 3 中指定消息驱动 Bean 依赖项?

Symfony 3 - 具有多个数据库连接的 EntityManager 依赖注入(inject)

spring - Spring 存储库中 EntityManager 注入(inject)时出现 java.lang.NullPointerException