这是一个特定版本这个问题.
我想检查是否插入了重复的行。我应该在我的应用程序层以编程方式检查它:
if (exists(obj))
{
throw new DuplicateObjectException();
}
HibernateSessionFactory.getSession().save(obj);
或者我应该捕获数据库层抛出的异常并在违反约束时触发?
try
{
HibernateSessionFactory.getSession().save(obj);
}
catch(ConstraintViolationException e)
{
throw new DuplicateObjectException();
}
EDIT:换句话说:虽然约束仍然存在(无论如何,这是很好的数据库设计,而且我不能确定我的应用程序将是唯一访问该表的应用程序),但我是否应该依赖该约束并处理其违规将引发的异常,或者我还是最好检查一下?
EDIT2:当然,我在事务中进行检查+插入,锁定表以确保没有其他进程同时写入另一条记录
首先你must在数据库上有一个主键或唯一约束来正确地强制这种唯一性 - 毫无疑问。
鉴于存在约束,您应该在应用程序中以哪种方式编码?我的偏好是尝试插入并捕获异常。因为大概大多数插入都会成功,只有少数会因为重复而失败(这就是“异常”所暗示的!):当数据库无论如何都要执行自己的约束检查时,在每次插入之前执行存在检查效率很低。
此外,理论上,存在检查无论如何都可能是错误的 - 如果其他人设法在存在检查和插入之间的一小段时间内提交具有相同键值的记录。然后,如果您不捕获数据库异常,您会认为插入成功,但实际上没有成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)