Hibernate LazyInitializationException; hibernate session 失效
LSPC最近遇到一个Hibernate Lazy Load的Exception,其大致的情形如下:
用hibernate load一个对象
调用一段直接的JDBC/PLSQL代码(可能是被调用的其他组件程序内部调用的), 此时,会用到DBean来获取连接,DBean有两个默认参数:needFlush,NeedClear,默认都是True. 即调用Dbean之后,默认会将hibernate session中内容更新到数据库,并清空session。保证数据同步。
原先的程序继续访问之前获取到的hibernate对象,这时就会发生Hibernate Session失效的问题。
对于这种问题,在整个系统一级目前没有很好的解决方法,
但是对于TP/CC的公用组件,我们可以通过如下步骤来避免这个问题:
对于同一个表,要么100%用JDBC/PLSQL访问,要么100%用hibernate访问,避免同时使用导致数据不一致
由于同一个对象不会同时被JDBC/PLSQL和hibernate访问,因此不可能存在冲突,
因此所有TP/CC组件在创—Bean的时候,都可以将flush和clear设置为false。
在某些特殊情况下,允许在JDBC/PLSQL中读取其他可能被hibernate mapping的表,此时flush属性设置为true,但是clear属性一定是false