Hibernate策略离线获取多个表?

时间:2012-06-20 17:27:03

标签: hibernate lazy-loading parent-child fetch

听起来很疯狂,但这是故事。

背景:

  • 想象一下,我们的数据库看起来像:公司有n个配偶和子女的员工。员工也有带轮胎的汽车......等等......
  • 我们的应用程序提供Web和桌面UI。因此,用户希望从多个表中加载数据,以便在桌面上脱机工作。例如:将大约1000家公司加载到桌面以进行处理。
  • 数据量有点大,从数千个记录到有时数十万个不等。但离线加载的数据并不是那么大,只有几千个。

当前架构:

  • 我们正在使用HibernateAssembler from Adobe ADEP4.6,与DAO非常相似,例如我们拥有一个汇编程序的每个实体。但是对Hibernate的访问非常有限。
  • 对于网络,我们使用LAZY Loading,到目前为止一直很好。
  • 对于AIR桌面,我们正在尝试许多选项

AIR桌面的选项,请注意实体都标记为LAZY,我们正在考虑以下1个选项:

  1. 在命名的hql中使用“fetch join”:将公司,员工,汽车,轮胎装在一起hql
  2. 分别加载每个表格,然后手动匹配。
  3. 在BatchSize中使用EAGER FETCH?!!难以控制
  4. 放弃Hibernate并回到巨大的JDBC查询。
  5. 请给我们你的建议。感谢

1 个答案:

答案 0 :(得分:1)

  1. 如果您有多个1-N关系,则返回的ResultSet将包含如此多的冗余数据,以至于根据我的经验,Hibernate处理速度太慢。

  2. 我会使用Hibernate或纯SQL来实现这一点。实际上,Hibernate可以通过使用@Fetch(FetchMode.SUBSELECT)注释你的关系来在一定程度上做到这一点。 例如,当您根据条件检索某些公司时,将运行以下SQL:

    SELECT * FROM company WHERE condition
    SELECT * FROM employee WHERE employee.company_id IN (SELECT id FROM company WHERE condition)
    

    请注意,这仅适用于某些数据库。如果表现不佳,请考虑#3。

  3. 我在这种情况下尝试过BatchSize,它在一定程度上改善了性能,但选项#2更好。

  4. 归结为SQL运行。如果这是有效的,Hibernate通常不会增加太多开销(只是创建对象的开销,将所有对象保留在内存中等)。