Hibernate 对象急切地加载惰性集合
Hibernate Object Eagerly Loads Lazy Collection
我有一个休眠实体对象调用项目,它有两个集合,称为注释和消息,如下所示:
@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));
}
我认为一个问题可能是我正在获取笔记并导致休眠将它们加载到项目中。但是,在我执行该语句之前,调试器会在我获取注释之前显示项目中的注释。
这里是通过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 获取项目的方法中,我没有得到注释和消息的结果。
如何确保我想要延迟加载的集合正在延迟加载?
只要您调用 getter,就会初始化延迟加载的集合。因此,该语句目前无法用于检测集合是否延迟加载。如果要检查,请使用方法 Hibernate.isInitialized(project.getNotes())
.
所以我想通了,当我打开项目变量上的显示并单击注释或消息时,eclipse 正在调用项目上的 getNotes 和 getMessages,从而从数据库动态加载注释和消息。
@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));
}
我认为一个问题可能是我正在获取笔记并导致休眠将它们加载到项目中。但是,在我执行该语句之前,调试器会在我获取注释之前显示项目中的注释。
这里是通过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 获取项目的方法中,我没有得到注释和消息的结果。
如何确保我想要延迟加载的集合正在延迟加载?
只要您调用 getter,就会初始化延迟加载的集合。因此,该语句目前无法用于检测集合是否延迟加载。如果要检查,请使用方法 Hibernate.isInitialized(project.getNotes())
.
所以我想通了,当我打开项目变量上的显示并单击注释或消息时,eclipse 正在调用项目上的 getNotes 和 getMessages,从而从数据库动态加载注释和消息。