我有一个模型课:
public class LimitsModel {
private Long id;
private Long userId;
private Long channel;
}
我对在字段userId
和channel
上设置的实体也有唯一的约束。在整个应用程序中,这些应用程序不可能重复。
在开发过程中增加了限制,因此我们已经有用户和渠道,并且必须为每个现有用户创建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
上。获得限制然后创建限制的块可能被调用两次。当第二次调用新限制时,数据库中是否应该已经没有这些新限制?交易是否已经提交?