hibernate代理对象纠错进程
hibernate代理对象纠错过程
前两天同事遇见一个诡异现象,导入excel时,其他数据均没问题,只有一条出现职位为空的现象。
数据结构如下,OrgStation和orgUnit为双向关系。
错误现象为:其他所有的employee对象经过sql fetch出来以后的majorStation都是真实对象,而唯有一条employee的majorStation为代理对象。
sql语句如下:
错误很明显就是这个代理对象在fetch之前已经进入内存了。但是只执行了一条sql语句为什么会进来,百思不得其解。
纠结了10分钟之后,发现原来是unit里面的leaderStation问题。因为只fetch到unit层。unit里面的leaderStation为代理对象。
而employee里面为代理对象的职位正好是部门的领导职位,也就是fetch unit时候被代理的对象。到此真相大白。。
sql语句改为后错误解除。
总结一下,hibernate的错误归根结底就是那么几个,但是表现的错误形式各不相同。这个错误形式算是第一次见到。
而且还和excel的数据顺序有关,试想如果领导永远是排在第一个导入,这个错误压根也不会出现。。
前两天同事遇见一个诡异现象,导入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的数据顺序有关,试想如果领导永远是排在第一个导入,这个错误压根也不会出现。。