java - Spring3/Hibernate断言失败

标签 java mysql spring hibernate session

这是一个简单的 hibernate 代码,它将一个值插入到表中。 如果该行已经存在,则查询该行并返回数据。 大多数时候,代码运行良好,没有任何问题。

在一个非常特殊的情况下,三个不同的客户端正在尝试将完全相同的行插入表中。当然,只插入一行。另外两次插入失败并落入 try-catch block 中。

try catch block 中有一个查询,查询数据并将值发送给客户端。这会导致 session 上的后续操作出错。

Hibernate throws "ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)" in the logs.

这是代码。处理这种情况的正确方法是什么?

@Override
public void addPackage(PackageEntity pkg) {

    try{

        getCurrentSession().save(pkg);
        getCurrentSession().flush();

    }catch( ConstraintViolationException cve ){

        // UNIQ constraint is violated
        // query now, instead of insert
        System.out.println("Querying again because of UNIQ constraint : "+ pkg);
        PackageEntity p1 = getPackage(pkg.getName(), pkg.getVersion());

        if( p1 == null ){
            // something seriously wrong
            throw new RuntimeException("Unable to query or insert " + pkg);
        }else{
            pkg.setId(p1.getId());
        }

    }catch (Exception e) {
        e.printStackTrace();
    }catch (Throwable t) {
        t.printStackTrace();
    }
}

最佳答案

主(或)复合键使每行数据唯一并避免此错误。

如果您需要所有这三个请求中的数据,请在表中创建一个唯一的主键并将其添加到实体中。

主键可以是数据中任何唯一的东西、自动生成的序列或 UUID/GUID。

关于java - Spring3/Hibernate断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084871/

相关文章:

c# - 在 C# pt 中调试 DLLImport。 2个

java - hibernate/Postgres : duplicate key value violates unique constraint

java - 敌人发射和移动的问题

java - 如果一个方法不使用对象的字段那么它是线程安全的吗?

java - Swagger 上的 API 分割

php - 如何在 php 中从 mysql 数据库生成图形和图表

java - 虽然有数据行,但结果集为空

java - 为二十一点程序返回 bufferdimage 的方法

java - 注入(inject)从 Java/Spring 中的某个方法返回的 String 属性

java - 使用@RunWith(SpringJUnit4ClassRunner.class),可以访问ApplicationContext对象吗?