我有一位患者,他拥有一套NeurologicalFinding医疗记录。
患者类结构如下:
@Entity
@Table(name = "patient")
public class PatientEntity {
//other properties
@OneToMany(fetch = FetchType.LAZY, mappedBy = "patient")
private Set<NeurologicalFindingEntity> neurologicalFindingList;
public Set<NeurologicalFindingEntity> getNeurologicalFindingList() {
return neurologicalFindingList; //DEBUGGER never got to this line
}
//other get and set methods
}
NeurologicalFinding类结构如下:
@Entity
@Table(name = "neurological_finding")
public class NeurologicalFindingEntity{
//other properties
@ManyToOne
@JoinColumn(name = "patient_id")
private PatientEntity patient;
//get and set methods
}
在我的应用程序中,我希望通过他的ID获取患者,而不使用他的NeurologicalFinding记录以及DAO的以下方法:
public PatientEntity getPatientById(int patientId) {
Criteria criteria = sessionFactory.getCurrentSession()
.createCriteria(PatientEntity.class);
criteria.add(Restrictions.eq("id", patientId));
return (PatientEntity) criteria.uniqueResult();
}
当我使用这种方法时,我仍然对他的NeurologicalFinding记录感到耐心。 永远不会调用该集合的getter(使用debuger进行检查),那么当没有人要求时,如何加载延迟集合呢?
如果您需要有关我的应用的更多信息,我可以为您提供。
答案 0 :(得分:0)
首先,您可以在此特定方案中使用EntityManager.find()
而不是条件查询。其次,您可以尝试将注释放在setter而不是字段上。第三,你也可以在关系的另一边指定fetch=LAZY
,但我认为这不是你需要的。
最后,根据我的经验(尽管这适用于EclipseLink,不一定是Hibernate)我发现,为了支持延迟提取,有时需要字节码编织。每个JPA提供程序通常都有一个工具(以及Ant任务和Maven插件)。
答案 1 :(得分:0)
尝试使用hibernate.show_sql = true
打印查询并确认延迟加载是否有效:
<bean id= "entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
...
<property name="jpaProperties" >
<props>
...
<prop key="hibernate.show_sql" >true</ prop>
<prop key="hibernate.format_sql" >true</ prop>
<prop key="hibernate.use_sql_comments">true</prop>
...
use_sql_comments
特别重要,因为它会在查询开头打印注释,说明查询的原因:一对多,命名查询名称,条件查询文本等。< / p>
然后通过设置断点,可以查看在使用调试器检查集合时是否获取了集合。
如果不是这种情况,并且未调用getter,则可能是通过直接访问属性neurologicalFindingList
直接在类中触发延迟加载。
您是否直接在PatientEntity
内访问该属性,例如在equals和hashcode中?如果是这样,通过从equals和hashcode中删除它,问题应该得到解决。