在引发约束违规异常之后,有什么方法可以继续使用线程绑定的hibernate会话吗?我在这里举一个简短的例子:
Parent other=service.load(33); // loads a new parent try { Parent p=new Parent(); p.setName("A name"); service.save(p); // a @Transactional spring service class, throws ConstraintViolationException - name should be at least 15 characters long } catch (ConstraintViolationException e){ // i would like to handle validation errors and proceed normally // but the session is allready closed here } System.out.println("Children: " + other.getChildren()); // lazy initialization exception, even when using opensessioninview
从现在开始,hibernate会话完全没有用,即使对于只读操作,例如使用OpenSessionInView模式在视图中呈现惰性集合。
Session的文档指出, 如果Session引发异常,则必须回滚事务并丢弃会话。 发生异常后,会话的内部状态可能与数据库不一致。。
AFAIK,无法从中恢复,我记得工作中有人警告我,由于这些问题,请勿使用session-per-request / OpenSessionInView- pattern。