繁体   English   中英

由于MS SQL中UNIQUE约束的非标准行为,Spring / Hibernate的解决方法

[英]Workaround for Spring/Hibernate due to non-standard behaviour of UNIQUE constraint in MS SQL

索引上有一个UNIQUE数据库约束,它不允许多个记录具有相同的列。

有一段代码由Hibernate(v2.1.8)管理,执行两个DAO
getHibernateTemplate().save( theObject )
调用导致两个记录输入上述表格。

如果在没有事务的情况下执行此代码,则会生成INSERT,UPDATE,然后是另一个INSERT和另一个UPDATE SQL语句,并且工作正常。 显然,序列是先插入包含DB NULL的记录,然后用适当的数据更新它。

如果此代码在包含在单个Spring事务中的Spring(v2.0.5)下执行,则会产生两个INSERTS,然后由于上面提到的UNIQUE约束而立即发生异常。

此问题仅在MS SQL上表现出来,因为它与ANSI SQL不兼容。 它适用于MySQL和Oracle。 不幸的是,我们的解决方案是跨平台的,必须支持所有数据库。

拥有这一堆技术,对于给定问题,您最喜欢的解决方法是什么?

您可以尝试在两次保存之间刷新休眠会话。 这可能会强制Hibernate在第二次插入之前执行第一次更新。

另外,当你说hibernate用insert插入NULL时,你是说每列都是NULL,还是只是ID列?

我没有Hibernate的经验,所以我不知道你是否可以随意更改数据库,或者Hibernate是否需要特定的数据库结构,你无法改变。

如果您可以进行更改,那么您可以在MSSQL中使用此变通方法来模拟ANSI行为:

删除唯一索引/约束

定义一个这样的calc字段:

alter table MyTable Add MyCalcField as 
case when MyUniqueField is NULL 
      then cast(Myprimarykey as MyUniqueFieldType) 
      else MyUniqueField end

在您创建的新字段上添加唯一约束。

当然,如果MyUniqueField不是主键,这也适用! :)

您可以在databasejournal.com上找到本文的更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM