每次都会获取Lazy OneToMany系列

时间:2014-03-15 17:28:45

标签: java hibernate one-to-many

我有一位患者,他拥有一套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进行检查),那么当没有人要求时,如何加载延迟集合呢?

如果您需要有关我的应用的更多信息,我可以为您提供。

2 个答案:

答案 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中删除它,问题应该得到解决。