Java Spring3/Hibernate断言失败

Java Spring3/Hibernate断言失败,java,mysql,spring,hibernate,session,Java,Mysql,Spring,Hibernate,Session,下面是一个简单的hibernate代码,它将值插入到表中。 如果该行已存在,则查询该行并返回数据。 大多数情况下,代码工作正常,没有问题 在一个非常特殊的情况下,三个不同的客户机试图将完全相同的行插入表中。当然,只插入一行。其他两个插入失败,并落入try-catch块 try-catch块中有一个查询,它查询数据并将值发送给客户端。这将导致会话上的后续操作出错 Hibernate抛出“错误org.Hibernate.AssertionFailure-断言 发生故障(这可能表明Hibernate中

下面是一个简单的hibernate代码,它将值插入到表中。 如果该行已存在,则查询该行并返回数据。 大多数情况下,代码工作正常,没有问题

在一个非常特殊的情况下,三个不同的客户机试图将完全相同的行插入表中。当然,只插入一行。其他两个插入失败,并落入try-catch块

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

Hibernate抛出“错误org.Hibernate.AssertionFailure-断言 发生故障(这可能表明Hibernate中存在错误,但更多 可能是由于不安全地使用了日志中的“会话”

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

@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