有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

由于MS SQL中唯一约束的非标准行为,Spring/Hibernate的java变通方法

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

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

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

如果此代码在单个Spring事务中包装的Spring(v2.0.5)下执行,则会导致两次插入,然后由于上述唯一约束而立即发生异常

这个问题只在MS SQL上出现,因为它与ANSI SQL不兼容。它在MySQL和Oracle上运行良好。不幸的是,我们的解决方案是跨平台的,必须支持所有数据库

有了这一堆技术,对于给定的问题,您首选的解决方法是什么


共 (2) 个答案

  1. # 1 楼答案

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

    另外,当您说hibernate使用insert插入NULL时,您的意思是每一列都是NULL,还是仅仅是ID列

  2. # 2 楼答案

    我没有Hibernate方面的经验,所以我不知道您是否可以随意更改DB,或者Hibernate是否需要特定的DB结构,您无法更改

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

    删除唯一索引/约束

    定义如下所示的计算字段:

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

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

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

    您可以在this article at databasejournal.com中找到更多详细信息