如何使用弹簧数据插入重复键?

时间:2016-09-20 15:51:54

标签: hibernate spring-data-jpa

我有两个实体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列)?

0 个答案:

没有答案