如何看懂数据库抛出的exception
耳熏目染了好久的hibernate,
刚好,亲身使用了一段时间的nhibernate。
实践上的问题真不少,
lazy session生存管理,性能优化等问题。
现在遇到棘手的事情是数据库异常的判断。
本来,约束我是做在业务逻辑里面的。
在保存数据库前,主动检查数据库存在的冲突。
因为防止并发出错,把检查和更新的一段临界区代码lock起来。
在效率方面我已经是做出最大的妥协了,
为了检查,多次的数据库交互,还有并发保护。
可是,如果在更新关联到collection时,我是不是把collection一个一个地检查?
在我还没有修改过collection检查?更或者,这个lazy collection还没读出来?
我翻看了hibernate的文档,中可能有两个东西能帮上忙。beforeUpdate volidatable
但即使上面两个真能解决这个问题,还是要考虑并发。
但现在我把约束做在了数据库上。
在处理业务代码中,只管调用update和catch exception。
在数据层中,通过判断数据库异常(例如,是违反了表中的那一个约束),
转换成业务异常,再往业务层抛。
可是,我没办法从exception中判断出触发的原因,即使是SqlError也没有。
我想到的唯一的信息可获取于 exception.Message,
通过字符串搜索?我无法忍受。
直接把message输出也不符合我的要求。
意思是说,我没办法用数据库的约束功能?