美好的一天。我需要检查字段的初始化(加载)。对于此任务,我尝试使用Hibernate.isInitialized
。我有以下实体:懒惰加载字段休眠“isInitialized”
@Entity
public class Contractor {
/* ... */
@OneToMany(mappedBy = "contractor", fetch = FetchType.LAZY)
private List<Work> works = new ArrayList<Work>();
/* ... */
}
@Entity
public class Work {
/* ... */
@ManyToOne(fetch = FetchType.LAZY)
private Contractor contractor;
@ManyToOne(fetch = FetchType.LAZY)
private Project project;
/* ... */
}
@Entity
public class Project {
/* ... */
@OneToMany(mappedBy = "project", fetch = FetchType.LAZY)
private List<Work> works = new ArrayList<Work>();
/* ... */
}
然后我试图通过如下方法获取实体:
List<Contractor> list = em.createQuery("SELECT c FROM Contractor c").getResultList();
for (Contractor contractor : list) {
Hibernate.initialize(contractor.getComments());
Hibernate.initialize(contractor.getWorks());
for (Work work : contractor.getWorks()) {
Hibernate.initialize(work.getProject());
}
}
return list;
之后,我通过双向查询(序列化)领域的初始化标志:
Project p = contractor.getWorks().get(0).getProject();
Field f = Hibernate.getClass(p).getDeclaredField("works");
f.setAccessible(true);
System.out.println(Hibernate.isInitialized(f.get(p)));
System.out.println(Hibernate.isInitialized(contractor.getWorks().get(0).getProject().getWorks()));
结果对于集合(true,false)是不同的,但对于单个对象是相同的。可能有人知道为什么?
是的。我使用JOIN FECT,但不是全部选择。但我尝试编写通用的序列化方法(对于未加载的惰性字段并且已经通过JOIN FECT惰性字段加载,所以我需要一种方法来动态检查初始化。 – dmitrievanthony
@dmitrievanthony我编辑了我的回答,提供了使用“PersistenceUnitUtil”或'PersistenceUtil'类。虽然看起来你的问题更多的是为什么休眠行为在这种情况下是奇怪的,你描述(我不知道)。 –
是的,我尝试使用PersistenceUtil,但结果相同 – dmitrievanthony