hibernate多表查询中单表的同一条记录内存共享时弊病的处理
在查询A表时关联了B表、C表,C表和A表是多对一的关系,B和C一对一的关系。我将三张表的数据整合在一起做成一个视图。hibernate多表查询中单表的同一条记录内存共享,对于有多条C表记录与A表对应时,Hibernate不会对A表进行重复查询,与之关联的C表的多条记录也不会继续查询,而仅仅是复制之前C的对象。这不是我想要的结果。
Hibernate管理的表原则上需要有主键,Hibernate对数据的所有操作大都以这个主键为准。主键有一般主键和组合主键两种。以上的三张表各有各的主键,C表和A表是多对一的关系。如果以C表的主键为视图的主键则不会出现上述问题,当以A表的主键为视图中的主键时,由于结果集中A表的主键有重复,Hibernate根据缓存机制进行了不再重复检索的优化。这种优化在此时来说无疑是画蛇添足的。
那么如何避免这种问题呢?下面给出两种解决方案。
方案一:临时构建一个唯一主键,该主键只用于取消Hibernate的重复对象不检索的功能。这种方案具有通用性。不管你的组合查询中有多少张表,设立一个临时唯一主键,就可以得到你想要的结果。这里我们将uuid设置为主键,原来的主键改为一个普通的属性。
select sys_guid() as uuid, t.* from ( select distinct a.*,b.is_complated from A a , C c,B b where a.aid=c.aid and c.cid=b.cid )t;
方案二:如上述问题,这里C和A有着多对一的关联关系。C中有着A的外键,通过C可以查询所有A表中的内容。这时可以将C表的主键设为视图中的主键。推而广之,如果你想通过组合查询查询更多多张表中的记录返回在一个结果集中,建议选择一个可以唯一标示其中每条记录的列作为主键,或者通过创建组合主键的方式来达到想要的结果。但这种方式有时存在局限性,考虑不周还是很容易再次出现上述问题。