违反了唯一约束-不可能,但是...为什么?

时间:2019-07-18 06:39:47

标签: java sql oracle unique-constraint

我有一个模型课:

public class LimitsModel {
    private Long id;
    private Long userId;
    private Long channel;
}

我对在字段userIdchannel上设置的实体也有唯一的约束。在整个应用程序中,这些应用程序不可能重复。

在开发过程中增加了限制,因此我们已经有用户和渠道,并且必须为每个现有用户创建limits实体。因此,我们是在某些操作期间创建它们的,没有其他创建它们的地方。这是我们创建它们的方式:

   List<LimitsModel> limits = userDAO.getUserLimits(userId, channel);

   if(isNull(limits) || limits.isEmpty()){
        List<limitsModel> limitsToSave = this.prepareLimits();
            limits = userDAO.createOrUpdateLimits(limitsToSave);
   }
   .
   .
   .
   other operations

我得到的是

Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (USER_LIMITS_UNIQUE) violated

任何线索可能是什么情况?我只是从数据库中提取限制,检查它们是否存在以及是否不创建它们。唯一约束违反的地方在哪里?

编辑


createOrUpdateLimits只是调用此方法:

public void createOrUpdateAll(final Collection<?> objects) {
    getHibernateTemplate().executeWithNativeSession(session -> {
        Iterator<?> iterator = objects.iterator();

        while (iterator.hasNext()) {
            session.saveOrUpdate(iterator.next());
        }
        return null;
    });
}

prepareLimits并不复杂,一个简单的构建器:

private List<LimitsModel> prepareLimits() {
    List<LimitsModel> limitsToSave = LimitsModel.CHANNELS.stream()
                    .map(channel -> LimitsModel.builder()
                           .userId(UserUtils.getId())
                           .channel(channel)
                           .build())
                    .collect(Collectors.toList());

    return scaLimitsToSave;
}

getUserLimits

public List<LimitsModel> getUserLimits(Long userId, Long channel) {
    return getHibernateTemplate().execute(session -> {
        final Criteria criteria = session.createCriteria(LimitsModel.class)
               .add(Restrictions.eq(LimitsModel.PROPERTY_USER_ID, userId));

        if (nonNull(channel)){
            criteria.add(Restrictions.eq(LimitsModel.PROPERTY_CHANNEL, channel));
        }

        return criteria.list();
    });
}

约束位于userId, channel上。获得限制然后创建限制的块可能被调用两次。当第二次调用新限制时,数据库中是否应该已经没有这些新限制?交易是否已经提交?

0 个答案:

没有答案