Hibernate对象急切地加载了Lazy Collection

时间:2015-05-22 17:58:43

标签: java spring hibernate collections lazy-loading

enter image description here我有一个hibernate实体对象调用项目,它有两个集合,称为注释和消息,如下所示:

@Entity
@Table(name = "project")
public class Project {
    ...
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "project")
    private List<Note> notes;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "project")
    private List<Message> messages;
    ...
}

但由于某种原因,在我的测试方法中获取项目,已经加载了注释和消息,我的测试验证了:

@Test
public void testLoadProjectNotes() {
    Project project = projectDao.getProjectById(41);
    assertNotNull(project.getNotes().get(0));

}

我认为问题可能是我得到笔记并导致hibernate将它们加载到项目中。但是,在我执行该语句之前,调试器会在我得到注释之前显示项目中的注释。

以下是通过id获取项目的方法:

public Project getProjectById(long id) {
    Criteria criteria = new SmartCriteria(getSession().createCriteria(Project.class));
    criteria.add(Restrictions.eq("id", id));
    return (Project) criteria.uniqueResult();
}

所以在通过id获取项目的方法中没有任何地方我得到了笔记和消息的结果。

如何确保懒惰加载我想要延迟加载的集合?

2 个答案:

答案 0 :(得分:7)

一旦调用getter,就会初始化一个延迟加载的集合。因此,如果集合是延迟加载的,那么该语句到目前为止无法用于检测。如果要检查,请使用方法Hibernate.isInitialized(project.getNotes())

答案 1 :(得分:0)

所以我想通了,当我打开项目变量上的显示并单击注释或消息时,eclipse会在项目上调用getNotes和getMessages,从而动态地从数据库中加载注释和消息。