在hibernate中对oracle的clob和blob字段的处理采用光标的方式来处理,其中隐含的深层含义是:对该类型字段的存取,hibernate维护了一个关联该字段的数据库的连接A,该连接和session的连接有可能不是同一个,因此问题就出来了,在session中缓存的具有该字段的对象,如果上述的连接A断开,那么该字段的获取将报错。如下: java.sql.SQLException: Must be logged on to server
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160) atoracle.jdbc.ttc7.TTC7Protocol.assertLoggedIn(TTC7Protocol.java:2296) atoracle.jdbc.ttc7.TTC7Protocol.freeTemporaryLob(TTC7Protocol.java:3351) atoracle.sql.LobDBAccessImpl.freeTemporary(LobDBAccessImpl.java:774) at oracle.sql.CLOB.freeTemporary(CLOB.java:1085) at oracle.sql.CLOB.freeTemporary(CLOB.java:1036) 上边时clob字段的出错信息,blob字段类似。解决办法:对象在session中进行reload操作,即session.refresh(Object o)操作。