我有两个实体QuoteRequest.java和Quote.java,代表我的数据库中的两个表:quotes和quote_requests。
业务逻辑说每个Quote都有一个QuoteRequest,但只有一个Quote是默认的,所以我添加了一个列" default_flag"到引号表并基于quote_request_id和default_flag列创建了一个约束。
每当我尝试创建一个新的Quote并将其设为默认值时,我都会收到此错误:
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:278) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE]
并进一步向下堆栈跟踪:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert duplicate key row in object 'dbo.quotes' with unique index 'quote_uk2'. The duplicate key value is (2, 1).
以下是试图在数据库中保存新Quote的代码:
@Transactional
public Quote createNewQuote(Long quoteRequestId, SomeForm data) {
QuoteRequest quoteRequest = quoteRequestRepository.findOne(quoteRequestId);
Quote quote = new Quote();
// code that fills the quote with data from SomeForm
quote.setQuoteRequest(quoteRequest);
quote.setDefaultFlag(true);
Quote oldDefaultQuote = quoteRepository.findUniqueByQuoteRequestAndDefaultFlag(quoteRequest, true);
if (oldDefaultQuote != null) {
oldDefaultQuote.setDefaultFlag(false);
}
quoteRepository.save(oldDefaultQuote);
quoteRepository.save(quote);
return quote;
}
那么如果新行具有与现有记录相同的唯一组合,如何在具有唯一约束的表中创建新行(columns_request_id和default_flag列)?