`
leobluewing
  • 浏览: 238883 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

hibernate代理对象纠错过程

 
阅读更多
前两天同事遇见一个诡异现象,导入excel时,其他数据均没问题,只有一条出现职位为空的现象。

数据结构如下,OrgStation和orgUnit为双向关系。


public class Employee{
   private OrgStation majorStation;
}

public class OrgStation {
   private OrgUnit unit;
}

public class OrgUnit {
   private OrgStation leaderStation;
}



错误现象为:其他所有的employee对象经过sql fetch出来以后的majorStation都是真实对象,而唯有一条employee的majorStation为代理对象。

sql语句如下:
String hql = "from Employee as user "
			+ "left join fetch user.majorStation ms "
			+ "left join fetch ms.unit unit ";


错误很明显就是这个代理对象在fetch之前已经进入内存了。但是只执行了一条sql语句为什么会进来,百思不得其解。

纠结了10分钟之后,发现原来是unit里面的leaderStation问题。因为只fetch到unit层。unit里面的leaderStation为代理对象。

而employee里面为代理对象的职位正好是部门的领导职位,也就是fetch unit时候被代理的对象。到此真相大白。。

sql语句改为后错误解除。
String hql = "from Employee as user "
			+ "left join fetch user.majorStation ms "
			+ "left join fetch ms.unit unit "
                        + "left join fetch unit.leadStation ls";



总结一下,hibernate的错误归根结底就是那么几个,但是表现的错误形式各不相同。这个错误形式算是第一次见到。

而且还和excel的数据顺序有关,试想如果领导永远是排在第一个导入,这个错误压根也不会出现。。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics