前两天同事遇见一个诡异现象,导入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的数据顺序有关,试想如果领导永远是排在第一个导入,这个错误压根也不会出现。。
分享到:
相关推荐
hibernate 对象关系映射总结hibernate 对象关系映射总结hibernate 对象关系映射总结
Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期
hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程
Hibernate操作持久化对象Hibernate操作持久化对象Hibernate操作持久化对象Hibernate操作持久化对象Hibernate操作持久化对象
Hibernate对象关系映射一对多 很基础等文档
hibernate中session对象的状态详解
Hibernate对象状态以及各种保存方法的区别
学习后总结了本文档,里面讲述了hibernate中的几种对象关系模型,与大家共享,方便学习
9.6 通过Hibernate调用存储过程 9.7 小结 9.8 思考题 第10章 映射组成关系 10.1 建立精粒度对象模型 10.2 建立粗粒度关系数据模型 10.3 映射组成关系 10.3.1 区分值(Value)类型和实体(Entity)类型...
在hibernate中使用存储过程,调用存储过程
Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、...
精通Hibernate:Java对象持久化技术详解.pdf 精通Hibernate:Java对象持久化技术详解.pdf
使用hibernate的query调用oracle的存储过程/function,包含例子,源码以及数据库文件
一个关于关于Hibernate对象的状态的描述。
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
MyEclipse10.7由表自动生成Hibernate实体对象,由本人亲自实践,非常实用。。
精通Hibernate:Java对象持久化详解解压后是pdf文档。